小程序微信支付

后端

后端分为两部分:

  1. 统一下单
  2. 二次签名
// 统一下单
$payment = app('payment');
$result = $payment->order->unify([
    'body'=>self::$typeMap[$this->type].'订单',
    'out_trade_no'=>$this->no,
    'total_fee'=>$this->price * 100,
    'trade_type' => 'JSAPI',
    'openid'=>$this->user->weapp_openid
]);

小程序和公众号的的统一下单是相同的,类型传的参数都是JSAPI
曾经也自己看着支付文档封装过通用支付类,不过现在成熟的库已经很多了,这里用的是easywechat

use function EasyWeChat\Kernel\Support\generate_sign;
...
// 二次签名
$params = false;
if($result['return_code'] === 'SUCCESS'){
    $params = [
        'appId'     => env('WECHAT_PAYMENT_APPID'), // 小程序的AppId
        'timeStamp' => time(),
        'nonceStr'  => $result['nonce_str'], // 统一下单返回的随机字符串
        'package'   => 'prepay_id=' . $result['prepay_id'], // 统一下单Id
        'signType'  => 'MD5', // 签名方法
    ];
    // 注意这里用的是商户平台的Key进行二次签名
    $params['paySign'] = generate_sign($params, env('WECHAT_PAYMENT_KEY'));
}

按照文档的要求准备好参数之后,使用easywechat中的签名方法generate_sign
注意一下perpay_id的处理方式,需要拼接为查询字符串放倒package中
曾经也自己写过签名方法,错了很多次,现在PHP的开发氛围真的比以前好太多了

前端

let responsePayment = await wepy.requestPayment({
  timeStamp: params.timeStamp.toString(),
  nonceStr: params.nonceStr,
  package: params.package,
  signType: params.signType,
  paySign: params.paySign
})
if (responsePayment.errMsg === 'requestPayment:ok') {
  // 用户付款成功
}

从服务器接到签名好的支付参数后调用requestPayment方法
如果这里做了await处理的话,判断用户支付操作成功可以用errMsg属性,否则用success回调函数
无论如何不能以此作为业务支付成功的判断

结果回调

和公众号支付回调相同

上一篇:almost a hero 差不多英雄 攻略


下一篇:R语言数据挖掘1.2 数据源