最近在研究个人支付接口,主要是想解决微信支付的问题。对比了好几个平台,payjs算是比较成熟的,市面上不少同类产品多少有点模仿它的影子。目前支付宝和微信都支持,不过支付宝的接口需要一定流量门槛才能开通,所以这次重点聊聊微信收银台模式的对接。

讲真,收银台模式对接起来相当简单。官方提供了现成的开发包可以直接用,当然也可以自己动手写,没太大难度。
一、个人通过代码实现的办法
首先需要配置商户号和通信密钥,这是最基础的一步:
$mchid = '**************'; // PAYJS 商户号
$key = '**************'; // 通信密钥
接下来是构造订单参数,这里需要明确订单的标题、金额和商户订单号:
// 订单参数构造
$data = [
'mchid' => $mchid,
'body' => '我是一个测试订单标题',
'total_fee' => 1,
'out_trade_no' => 'payjs_jspay_demo_' . time(),
];
签名算法是整个流程中的关键环节,需要确保参数按字典序排序并完成签名:
// 签名生成
function sign($data, $key){
array_filter($data);
ksort($data);
return strtoupper(md5(urldecode(http_build_query($data) . '&key=' . $key)));
}
然后给订单数据加上签名:
// 添加数据签名
$data['sign'] = sign($data, $key);
最后一步是通过浏览器跳转到收银台:
// 浏览器跳转到收银台
$url = 'https://payjs.cn/api/cashier?' . http_build_query($data);
header('Location: ' . $url);
到这里所有步骤就完成了,正常发起支付没问题。不过有个关键细节必须强调:最后一步的浏览器跳转,必须通过浏览器发起,而不是在后端用代码获取后直接发起。
二、异步通知的处理
假设你的域名是 https://www.abc.com,用于接收异步通知的URL是 https://www.abc.com/payjs/notify.php。只需要在构造订单时添加 notify_url 字段即可:
// 订单参数构造
$data = [
'mchid' => $mchid,
'body' => '我是一个测试订单标题',
'total_fee' => 1,
'out_trade_no' => 'payjs_jspay_demo_' . time(),
'notify_url' => 'https://www.abc.com/payjs/notify.php',
];
这样,用户支付完成后,服务器就能收到异步通知了。实测下来,通知的到达时间基本在1秒以内,基本感觉不到延迟。当然,如果前端轮询的时候频率设得比较低,比如三秒一次,那感知上可能会慢一些。
整个流程走下来相当顺畅,如果是刚入门的开发者,按照这个步骤操作应该不会遇到太大障碍。
