前置条件
- 站点需要先在小后台设置了异步回调地址,支付后才会有异步回调
小后台地址:金币与支付>>支付管理>>插件账户
- 用户的订单需要先在小后台添加了插件账户,并在账户中添加了JS支付类型,用户支付后才会有异步回调
小后台地址:金币与支付>>支付管理>>插件账户
- 用户支付成功后才会有异步回调
用户未支付不会触发异步回调
回调方式
用户支付完成后,千帆服务器会访问站点设置的异步回调地址
回调的秘钥暂时和openapi接口秘钥不一致,请使用千帆的secret_key
回调规则
- 用户支付成功之后,会像微信、支付宝一样进行的多次的异步回调
- 开发者在处理成功回调之后,需要返回“success”给千帆
- 如果没有返回“success”,千帆会按照下面的间隔时间重新发起异步回调;
- 间隔时间分别为:15秒,30秒,1分钟,3分钟,5分钟,15分钟,半小时,半小时,1小时,1小时,3小时,3小时。
- 如果一直没有返回“success”,之后将不再进行异步回调
- 我们随时会增减返回参数,请不要严格按照下面的表格里面的参数获取post值以及拼接string
例
- PHP
echo "success";
访问类型
POST
参数
字段名 | 类型 | 说明 |
---|---|---|
order_id | int | 订单ID |
uid | int | 订单支付用户的uid(为了安全最好验证一下uid是否和order_id匹配) |
type | int | 订单的类型,教程 |
pay_type | int | 订单的支付方式:1.金币,2.余额,4.微信,8.支付宝,64.虚拟币 (采用位运算,即3:金币+余额,5:金币+微信,9:金币+支付宝) |
pay_time | int | 订单支付时间戳 |
out_trade_no | string | 订单的商户订单号(千帆) |
trade_no | string | 微信、支付宝的流水号 |
cash_cost | int | 现金支付的金额(分) |
gold_cost | string | 金币支付的金额 |
virtual_cost | string | 虚拟币的金额 |
ext | string | 业务扩展参数(下单时传过来的字段,原样返回) |
timestamp | int | 异步回调的时间戳(东八区) |
nonce | string | 随机字符串 |
sign | string | 签名 |
安全验证
- sign 签名是否正确
- uid、order_id、type是否正确匹配
- timestamp 是否与当前的时间戳在post请求的合理时间范围内(可忽略)
- order_id,out_trade_no 只会一一对应,不会重复(可忽略)
- cash_cost,gold_cost,virtual_cost 是否和本地记录的数值相同
签名方法
签名过程
第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。
第二步,在stringA最后拼接上secret得到stringB字符串,并对stringB进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。
发起请求生成校验示例
获取请求参数(nonce为每个请求生成的不同的随机字符串),不包括sign参数
uid: 1
username: test
avatar: http://xxx.xxx.xxx.xxx.jpg
nonce: xxxxxxxxxxxxx
对请求参数排序组合得到stringA
stringA="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test"
拼接密钥”yyyyyy”
stringB="avatar=http://xxx.xxx.xxx.xxx.jpg&nonce= xxxxxxxxxxxxx&uid=1&username=test&secret=yyyyyy"
产生签名
signValue="3DB61D5B098BCBA7D2E2A0616541040A"
判断请求中的sign是否与生成的signValue相同
注意
- 用于签名的参数中应带有随机字符串,保证签名不可预测
- 请求参数内容中”@”开头的内容和sign字段不参与生成签名
- 用于签名的参数中不应包含secret字段,secret字段被保留用于密钥
PHP代码示例
function sign($params, $secret) {
unset($params['sign']); // 去除sign字段
ksort($params);
$sparams = array();
foreach ($params as $k => $v) {
if ("@" != substr($v, 0, 1)) {
$sparams[] = "$k=$v";
}
}
$sparams[] = "secret=" . $secret;
return strtoupper(md5(implode("&", $sparams)));
}
文档更新时间: 2023-08-02 17:12 作者:千帆云