php支付接口签名,php实现支付接口签名验证

前言

游戏服务器的玩家充值流程,如果通过google商店或者app store进行充值的话,需要实现回调支付地址。玩家充值成功以后,app store或者google商店会向回调地址传递参数,验证玩家充值,通知游戏服务器给玩家发送钻石或者礼包,并保存消费记录。

易接sdk

小编使用的易接SDK是一套规范、统一的接口,具有下列特点:

通过易接SDK的接口,可以使用易接工具合成不同的渠道包,不需要阅读渠道SDK文档或调试渠道接口;

易接SDK(Android)支持多种平台,包括:Java、cocos、flashair、Unity3D,JS,lua,极大程度的满足游戏需求;

易接SDK(IOS越狱)支持多种平台,包括:Object-C、Cocos C++、Unity3D,极大程度的满足游戏需求。

消费同步接口

消费记录同步接口消费记录同步是由CP服务器实现的,接收用户付费结果的回调接口。当充值成功时,易接后台的状态是等待同步,并将信息传递给CP服务器,CP服务器做相应的处理后(签名验证,消费记录的存储,向游戏服务器发送充值成功的请求等),返回SUCCESS,易接后台的状态变成同步成功。其流程图如下:

adee46910376

php实现支付接口签名验证

同步接口

目前易接服务器向CP服务器通知支付成功情况以及接收CP服务器确认是一个HTTP接口。由CP服务器提供通知URL,易接服务器会在需要同步结果时(包括重新同步)主动调用CP服务器提供的通知URL。

同步接口的基本形式如下:

参数的具体含义可查阅:

同步参数签名

签名可以让CP服务器确认得到的数据来自于支付服务器而不是恶意第三方。签名方法为共享密钥+MD5方式,算法如下:

共享密钥:

双方共享一个字符串形的密钥

待签名串:

协议参数(对支付服务器是构成URL的参数,对CP服务器是接收的请求参数)中除了sign以外的所有参数,

按字典序由小到大排列 参数名=值,并在中间加入 “&”,构成比如如下的子串:

app=1234567890ABCDEF&cbi=CBI123456&ct=1376578903&fee=100&pt=1376577801&sdk=09CE2B99C22E6D06&ssid=123456&st=1&tcd=137657AVDEDFS&uid=1234&ver=1

支付服务器方签名:

签名=MD5(待签名串+共享密钥)

然后构成

CP服务器同步URL+待签名串+”&sign=”+签名

来进行请求

CP服务器验证:

待验证的签名=MD5(待签名串+共享密钥)

然后把“待验证的签名”和sign的子串进行比较,如果相同就说明一致。

同步失败的重传机制

无论是HTTP连接失败还是CP服务器端没有返回”SUCCESS”,支付服务器都会负责进行重传 ,服务器会按照一定的时间间隔重传同步记录。

PHP实现

public function sdkValid()

{

$request = array();

$request["app"] = $_GET['app'];

$request["cbi"] = $_GET['cbi'];

$request["ct"] = $_GET['ct'];

$request["fee"] = $_GET['fee'];

$request["pt"] = $_GET['pt'];

$request["sdk"] = $_GET['sdk'];

$request["ssid"] = $_GET['ssid'];

$request["st"] = $_GET['st'];

$request["tcd"] = $_GET['tcd'];

$request["uid"] = $_GET['uid'];

$request["ver"] = $_GET['ver'];

$sign = $_GET['sign'];

$tmpStr = $this->formatQueryMap($request);

$tmpStr = md5($tmpStr . C('SDK'));

if ($tmpStr == $sign) {

$chargeModel = new ChargeModel();

$chargeExist = $chargeModel->getCharge($request["tcd"]);

if ($chargeExist) {

echo "SUCCESS";

exit;

} else {

$Info = explode("_", $request["cbi"]);

$rows = $chargeModel->insertCharge($Info[0], $request["ct"], $request["fee"], $request["pt"],$request["ssid"], $request["st"], $request["tcd"], $request["uid"],$request["ver"], $Info[1]);

if ($rows) {

echo "SUCCESS";

exit;

} else {

echo "FAILED";

exit;

}

}

} else {

echo "FAILED";

exit;

}

}

private function formatQueryMap($paraMap)

{

$buff = "";

ksort($paraMap);

foreach ($paraMap as $k => $v) {

$buff .= $k . "=" . $v . "&";

}

$reqPar = "";

if (strlen($buff) > 0) {

$reqPar = substr($buff, 0, strlen($buff) - 1);

}

return $reqPar;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值