小天才支付接口并没有提供php版本的支付回调以及验签
以下是经过小天才官方人员帮助对接得出的php代码
appId 与 publicKey请与小天才官方获取换成自己的
/**
* 小天才支付结果回调方法。
* @param Request $request
* @return false|string
*/
public function notifyUrl(){
//获取请求body里面的数据。
$data = file_get_contents("php://input");
//json字符串转数组
$data = json_decode($data,true);
//验签
$result = $this->checkSign($data);
//通过验签 且状态为2 支付成功的回调 小天才文档
if($result && $data['status']==2){
//订单支付成功后的操作。。。。。
}
//通过验签 且状态为6 退款成功的回调 小天才文档
if($result && $data['status']==6){
//订单退款成功后的操作。。。。。
}
//返回数据给小天才
$arr=[
"code"=>"000001",
"desc"=>"success",
"data"=> null
];
return json_encode($arr);
}
/**
* 根据小天才提供的公钥验签
* @param $data 小天才支付接口回调服务器的post数据转换后的数组
* @return bool 判断验签是否成功
*/
public function checkSign($data){
//拼接验证字符串,此处根据小天才文档可能会改变,如果验签失败可以看最新的小天才文档整理参数
$arr=[
"appId"=> "小天才提供的appId",//小天才提供的appId
"notifyId"=> $data['notifyId'],
"orderId"=> $data['orderId'],
"status"=> $data['status'],
"userId"=> $data['userId'],
"xtcOrderId"=> $data['xtcOrderId'],
"totalFee"=> $data['totalFee'],
"finishTime"=> $data['finishTime']
];
//签名步骤一:按字典序排序参数
ksort($arr);
//签名步骤二:按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = "";
$i = 0;
$count = count($arr) - 1;
foreach ($arr as $k=>$v){
if ($i == $count) {// 拼接时,不包括最后一个&字符
$prestr .= strval($k) . "=" . strval($v);
} else {
$prestr .= strval($k) . "=" . strval($v) . "&";
}
$i++;
}
//步骤三:拼接openssl公钥并按64长度拆行(小天才提供的公钥)
$publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjDOIWBvtbLX96xKE8/XSBrXenADK56+59RV4hh3ESuL0PQLuwVMAgzdX5eBpJXm0EezYX8JDAN6qeYOz28ofFL7/HomYPj8dvzg5nHf7+BArDSGDEvMsZKu9qHWcHEroej4amjNtaYraNKU5SHm6FjFbNSDAp7zjLkb+FyJiGQtK5mLoBAnkLZi7b5jaFpUFGuquqKWg6qxdA5CAKZ5mzUe41wHmC6efv/Zm1VYnrPugkq7eqmNETocLv77vkzCzVhla9vbCZWO9+u6qj4VPBU8ptT4MQDO9t7NFK1GQjFYPNDVJrTYjXJN5JSdFIFsQ8F+3J3j361EchzbX6EzKKwIDAOAB"
$publicKey = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($publicKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
//步骤四:转换为openssl格式密钥
$publicKeyId = openssl_pkey_get_public($publicKey);
//步骤五:公钥SHA1验签
$sign = base64_decode($data['sign']);
$result = openssl_verify($prestr, $sign, $publicKeyId,OPENSSL_ALGO_SHA1);
openssl_free_key($publicKeyId);
//返回验签结果
return $result === 1 ? true : false;
}