一、背景

有个商城项目,是微信内H5的商城需要使用微信支付

二、方案调研

经过了解,微信支付支持h5支付+jsapi的方式支持,但是h5支付[参考备注1⃣️]的方案是只支持微信外的h5,没办法对微信内打开的h5页面进行操作的,于是我们最终还是采用的jsapi的方式去进行微信内H5支付的方案。

三、JSAPI支付简介[参考备注2⃣️]

image.png

过程

商户系统和微信支付系统主要交互:

1、商户server调用统一下单接口请求订单,api参见公共api【统一下单API

2、商户server接收支付通知,api参见公共api【支付结果通知API

3、商户server查询支付结果,api参见公共api【查询订单API

四、微信支付向微信下单和消息通知

微信支付jsapi这块,我没有使用官方demo和文档去自己实现一套,直接找了overtrue大大的 easywechat的composer包去进行,因为都封装好了,简单的说,就是分三步

1、获取到openid

2、向微信下单 参考代码链接

3、获取微信回掉信息/手动查询微信下单的订单状态支付回调信息

部分参考代码如下

//向微信下单部分参考代码
use EasyWeChat\Factory;

$config = [
    // 必要配置
    'app_id'             => 'xxxx',
    'mch_id'             => 'your-mch-id',
    'key'                => 'key-for-signature',   // API 密钥

    // 如需使用敏感接口(如退款、发送红包等)需要配置 API 证书路径(登录商户平台下载 API 证书)
    'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
    'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!

    'notify_url'         => '默认的订单回调地址',     // 你也可以在下单时单独设置来想覆盖它
];

$app = Factory::payment($config);
$result = $app->order->unify([
    'body' => '腾讯充值中心-QQ会员充值',
    'out_trade_no' => '20150806125346',
    'total_fee' => 88,
    'spbill_create_ip' => '123.12.12.123', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
    'notify_url' => 'https://pay.weixin.qq.com/wxpay/pay.action', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
    'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
    'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
]);

===============================================================
// 回调通知
$app = Factory::payment($config);
$response = $app->handlePaidNotify(function ($message, $fail) {
    // 你的逻辑
    return true;
    // 或者错误消息
    $fail('Order not exists.');
});

$response->send(); // Laravel 里请使用:return $response;

五、参考资料/备注/坑

参考资料1⃣️:

微信支付接口签名校验工具

https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=20_1

参考资料2⃣️:

官方SDK与DEMO下载

https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

备注1⃣️:

微信外H5支付的方案:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4

H5支付是指商户在微信客户端外的移动端网页展示商品或服务,用户在前述页面确认使用微信支付时,商户发起本服务呼起微信客户端进行支付。主要用于触屏版的手机浏览器请求微信支付的场景,可以方便的从外部浏览器唤起微信支付

备注2⃣️:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4

坑1⃣️: 当使用微信支付签名校验 工具把xml校验通过了,并且配置对了APPID、MCHID、KEY、APPSECRET的,绝大多数的“签名错误”都可以解决了,要是还不行,重置了KEY (商户支付密钥),就算重置后的,和之前的KEY一模一样,但竟然就可以了.


喝醉的清茶
165 声望15 粉丝