最近因公司业务,需要接入支付宝风险推送接口。文档有些零散,也踩了一些坑,在此总结一下。
应用场景:
基于强大的数据沉淀和精准的风险识别能力,主动向支付宝合作伙伴提供风险交易推送服务。风险类型主要包括欺诈、赌博、虚假交易,协助合作伙伴识别交易风险,助力合作伙伴业务健康发展。
业务流程:
风险类型:
接入指南:
a. 前期准备工作:
- 登录(支付宝账号)并注册RiskGo安全合作平台, 平台地址:riskgo.alipay.com
- 在开放平台创建一个新的应用,并申请上线,上线后在商户平台将该appid与商户pid进行绑定
b.配置创建的应用(主要配置接口加签方式、应用网关)
应用网关就是风险消息推送地址
c.在riskGo平台管理的工作台中找到交易安全防护(普惠版),点击申请服务,并填写相关参数
注: 有些同学在这儿卡住了,发现什么都没有,说明你的之前申请的应用没有上线并绑定pid.
d.申请信息填写完毕后,提交审核,审核通过后就可以联调了【强烈推荐使用支付宝平台开发助手来辅助进行验签工作,不然你验签失败后都不知道问题出在哪儿】
- 沙箱联调:
在沙箱联调界面会让你填入联调参数,填写完毕后,下方会生成请求数据【post】与URL【get】,基于自己程序的接收方式,选择对应的数据进行调试即可
- 生产环境联调:
沙箱联调成功后就可以进行生产环境调试了,此时你需要在程序的配置文件中将沙箱环境的公钥替换成你申请的appid对应的支付宝公钥(不然会验签失败)
注意事项:
- 联调时,推送数据的方式是post方式,数据是gbk编码的,并使用urlencode进行了加密处理。
- PHP在接收数据时应使用file_get_contents(“php://input”),如果使用$_POST来接收,会因为编码问题导致验签失败
- 正确显示接收的数据,应使用
$content = file_get_contents("php://input"); $content = urldecode($content); $content = mb_convert_encoding($content, 'utf-8', 'GBK');
- php验签的代码,此处是官方的代码示例,个人可根据实际业务需要封装 【注: 因为数据本身是gbk编码了, 所以下面代码中$aop->postCharset="UTF-8"可以不要】
$aop = new AopClient (); //编码格式 $aop->postCharset="UTF-8"; //支付宝公钥赋值 $aop->alipayrsaPublicKey=""; //回调的待验签字符串 $_POST="buyer_id=20880****42&total_amount=0.01&body=煜雨电脑网站测试&trade_no=2019032922001481941025940236¬ify_time=2019-03-29 19:42:04&subject=煜雨测试电脑网站支付&sign_type=RSA2&charset=UTF-8&auth_app_id=201****22¬ify_type=trade_status_sync&invoice_amount=0.01&out_trade_no=20190329ygyg45484544100003&trade_status=TRADE_SUCCESS&gmt_payment=2019-03-29 19:42:03&version=1.0&point_amount=0.00&sign=LDDUIGQmc+1qNtk3oyoAKVeMUKTngdX3ZjVeZOK0EjiPDJ/+Nk+0WSqcE6J7/5xb96Z/vP0yY3pVhZUiFVJ1G45/ys/HAleHh+EERZ1lkCkule1sSyaGFTKQGKx4uHpTyqIgRB1bouf19RPbSx1EkA0VkCarSy9G/OEG5Qmg8UdL2dRulMhlbOHS7tdMJJycDA8vOspOUMeQmk/H6IK9R2Kou5hN2T3KR1GWLYFK+z1jeZhQB3q52lZynO0OFjSzU4aQUBMW5QskQppBYd/ghtY/2YP+2H6YVGNgVmaheZMQ3PVTBALEV+8rZa91salH9DkKN2UCYGvNSNDT1VGCTQ==&gmt_create=2019-03-29 19:42:00&buyer_pay_amount=0.01&receipt_amount=0.01&fund_bill_list=[{\"amount\":\"0.01\",\"fundChannel\":\"PCREDIT\"}]&seller_id=208850*0**&app_id=20141****2¬ify_id=2019032900222194204081941005192208"; //签名方式 $sign_type="RSA2"; //把字符串通过&符号拆分成数组 $data = explode('&', $_POST); $params = array(); //遍历数组 foreach ($data as $param) { $item = explode('=', $param,"2"); $params[$item[0]] = $item[1]; } //输出拆分后的数据 //print_r($params); //验签代码 $flag = $aop->rsaCheckV1($params, null, $sign_type); //输出验签结果 //echo $flag; if ($flag) { echo "success"; } else { echo "fail"; }