一、背景
有个商城项目,是微信内H5的商城需要使用微信支付
二、方案调研
经过了解,微信支付支持h5支付+jsapi的方式支持,但是h5支付[参考备注1⃣️]的方案是只支持微信外的h5,没办法对微信内打开的h5页面进行操作的,于是我们最终还是采用的jsapi的方式去进行微信内H5支付的方案。
三、JSAPI支付简介[参考备注2⃣️]
过程
商户系统和微信支付系统主要交互:
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一模一样,但竟然就可以了.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。