前置条件

  • 站点需要先在小后台设置了异步回调地址,支付后才会有异步回调
      小后台地址:金币与支付>>支付管理>>插件账户
  • 用户的订单需要先在小后台添加了插件账户,并在账户中添加了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   作者:千帆云