# 在线支付

houdunren.com @ 向军大叔

xj-small

微信支付是腾讯公司的支付业务品牌,微信支付商户平台支持线下场所、公众号、小程序、PC网站、APP、企业微信等经营场景快速接入微信支付。

# 支付配置

首先需要在微信支付平台申请帐号,微信提供多款支付产品用于满足不同应用场景的支付。

image-20200812132837937

产品 说明
JSAPI支付 使用微信APP内部浏览器发起支付,适用于微信公众号等场景
APP支付 在APP中发起支付
Native支付 PC网页生成二维码,用户使用微信扫码支付
H5支付 手机端浏览器的H5页面中发起支付,会调取用户微信APP完成支付

# API证书

访问微信支付帐户中心 并下载证书工具来生成证书。

image-20200812133959591

将最终生成的证书妥善保存

image-20200812134823584

# API密钥

需要设置32位API密钥,可以使用随机密码生成器来生成,并设置到微信支付的API安全中,并妥善保存以供后面程序中使用。

image-20200812135040750

# 商户号

  1. 登录微信支付产品中心 选择支付产品

image-20200814102706421

  1. 然后在「开发配置」中查看商户号

    image-20200814102835711

# AppID

Native支付 中的 AppID帐号管理 中查看AppID,下面是与微信服务号的关联。

image-20200814111935324

# h5支付

使用h5支付时即在移动端浏览器支付时,需要配置H5支付域名

访问 产品中心 -> JSAPI支付 -> 开发配置 -> H5支付,注意域名不要加 www

image-20200814151523393

# 程序编码

我们来使用 yansongda/pay 扩展包快速为网站集成微信支付。

# 安装扩展

使用 composer 安装扩展包

composer require yansongda/pay -vvv

# 业务处理

下面是Laravel框架为例编写后台业务代码。创建控制器 App\Http\Controllers\PayController.php 内容如下

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Yansongda\Pay\Pay;
use Yansongda\Pay\Log;
use Endroid\QrCode\QrCode;

class PayController extends Controller
{
		//微信支付配置
    protected function config()
    {
        return  [
        		"key": "xxxx",	//商户支付API密钥
            "app_id": "xxx", //公众号AppID
            "mch_id": "xxxx", //微信支付商户号
            'notify_url' => route('pay.notify'), //异步通知地址
            //'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
        ];
    }
    
    //生成支付二维码
    //需要安装扩展包 https://github.com/endroid/qr-code
    public function pay()
    {
        $order = [
            'out_trade_no' => time(), //定单号
            'total_fee' => '0.01'*100,	//金额单位分
            'body' => 'test subject - 测试', //商品描述
        ];

        $result = Pay::alipay($this->config())->scan($order);

        //显示支付二维码
        $qrCode = new QrCode($result->code_url);
        return response($qrCode->writeString(), 200, ['Content-Type' => $qrCode->getContentType()]);
    }

		//异步通知
    public function notify()
    {
        $pay = Pay::wechat($payService->config());

        $data = $pay->verify();
        // 订单号:$data->out_trade_no
        // 支付宝交易号:$data->trade_no
        // 订单总金额:$data->total_amount
        Log::info($data);
        
        return $alipay->success();
    }
}

# 路由配置

下面来配置路由

Route::get('pay','PayController@pay')->name('pay');
Route::post('pay','PayController@notify')->name('pay.notify');

# 沙箱模式

沙箱环境 (Beta) 是微信为降低商户测试门槛,微信支付团队开发了一套独立的仿真测试系统。该系统根据验收用例金额的不同返回不同的响应报文,以满足商户正常功能测试、安全/异常测试及性能测试的需求。

# 理解沙箱

微信支付仿真测试系统(后简称仿真系统)的简化原理图。仿真系统的API协议与正式API完全相同(API接口文档)。商户开发者只需将正式API的调用URL增加一层sandboxnew路径,即可对接到仿真系统。

例如,付款码支付URL:https://api.mch.weixin.qq.com/pay/micropay

变更为:https://api.mch.weixin.qq.com/sandboxnew/pay/micropay

下图是仿真系统的支付流程 商户接入验收流程

仿真系统与生产环境完全独立,包括存储层。商户在仿真系统所做的所有交易(如下单、支付、查询)均为无资金流的假数据,即:用户无需真实扣款,商户也不会有资金入账。

# 验收用例

使用微信支付沙箱模式时不像支付宝可以随意设置金额,微信支付的沙箱模式只能使用固定金额的用例操作。

需要关注「微信支付商户接入验收助手」公众号来查看,请扫描下面二维码进行关注。

二维码

# 扩展配置

使用 yansongda/pay 进行支付时,只需要设置配置项 mode='dev' 即可。

protected function config(){
  return  [
      "key": "xxxx",	//商户支付API密钥
      "app_id": "xxx", //公众号AppID
      "mch_id": "xxxx", //微信支付商户号
      'notify_url' => route('pay.notify'), //异步通知地址
      'mode' => 'dev', // optional,设置此参数,将进入沙箱模式
  ];
}