支付宝异步通知验签失败解决方案

原贴地址:https://openclub.alipay.com/read.php?tid=1598&fid=69,欢迎大家访问

说明: 

    验签只需要使用到支付宝公钥 ,而不是使用应用公钥!

错误原因: 
  1.支付宝公钥使用错误导致 
  2.验签方法使用错误 
  3.参数错误导致,例如乱码,带自定义参数,编码格式。 


自查流程(按照推荐流程检查) 

     第一步(重点检查):支付宝公钥使用是否错误

     第二步:验签方法错误(请使用下方的demo中的地址接收异步通知进行验签测试) 

说明: 
    正常接口使用 AlipaySignature.rsaCheckV1,sign_type不参与签名 
    特殊说明:AlipaySignature.rsaCheckV2方法生活号异步通知需要使用,会保留sign_type参数参与验签。 


    异步demo分享(适用于所有支付类接口异步验签)

     java,php,.NET验签demo下载地址:https://docs.open.alipay.com/203/105910 

    注意:请大家使用手机网站demo进行验签测试即可,使用文件中的notify_url相关的文件和方法 

   自行实现验签参考:https://docs.open.alipay.com/200/106120

  第三步:异步通知返回参数检查 
      说明: 

      1.支付返回的通知不会乱码,一般java语言可能会在接收以后出现中文乱码,这个需要自己处理,demo中也给了一个方案(notify_url.jsp页面中。如果出现乱码就开启再测试):   

//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map<String,String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
    String name = (String) iter.next();
    String[] values = (String[]) requestParams.get(name);
    String valueStr = "";
    for (int i = 0; i < values.length; i++) {
        valueStr = (i == values.length - 1) ? valueStr + values[i]
                : valueStr + values[i] + ",";
    }
    //乱码解决,这段代码在出现乱码时使用
    //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
    params.put(name, valueStr);
}


分享一个验签成功的示例:

一、验签准备
1.原始报文:
【gmt_create=2018-04-20 17:50:32&charset=utf-8&seller_email=888@ymgxjy.com&subject=1元礼包&sign=UDKYin8FiNt74XERScJ1/Aw9byEa7Zyc73B0wa3b+TB8zjGY1TiEFgjkt52yQa4l0QBPH7nPj/lxCkXJ3iNCbdtI33llRIbVRw6HSKokrKXRDhLtcC6mRAQxihVPQGCCHU0FaB5kyCDALExT15Liw2We4UPj2RhqTQcK2J+dFfAd/9y1op7652wUz4fTqeag1NnsWW4/8n9U/HCnOcgSKms1W2V/uKeITUu+xGD53Kc5FiuHfhKTncvE8r0d5yiuJIwwMHB1UtwMWb3lDptqfe4RyYIbLAmRZRr3C71Jrsd2buPt/Wfk+7g3bYDmXoLO0uqf/SWgQGj4j5SsAgJBpw==&body=购买1元礼包&buyer_id=2088002909593621&invoice_amount=1.00¬ify_id=53d06fe330f23412ffadf96bedf4b2eksd&fund_bill_list=[{"amount":"1.00","fundChannel":"ALIPAYACCOUNT"}]¬ify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=1.00&app_id=2018041202546065&buyer_pay_amount=1.00&sign_type=RSA2&seller_id=2088031750966038&gmt_payment=2018-04-20 17:50:33¬ify_time=2018-04-20 17:54:23&version=1.0&out_trade_no=102&total_amount=1.00&trade_no=2018042021001004620551077378&auth_app_id=2018041202546065&buyer_logon_id=xie***@126.com&point_amount=0.00】

2.验签公钥:
【MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAj2loMvw06Q7ENphqLI/L/zMq+GbybavY6/zrmMvI3Jbk/U2D/CYRnBwPM0iLvOu1Y/sILeDtsQc7jeKPBYwOWnbO0eXYe6WnEuKSzj1zR+Za2Z4aBBKx/oIp99qvAE6oTk+LtQB5adcvrlLEiiyjD5Ilips+lr7A01AnWeIJ2hlXnDDmWUiMLCFzb6XXovuT2Hl/DqJBO3EAgMlfXSdtpWB41ppXIepIrdmL0hq/Vgvv6sAuqBYqjg+1gaEo6sq9Ev8JRqgCkQJsmhkwz206EBAtAkV4WCQN3tFEvtUBxiCRuNaoObPD+e7S1VTjFzCEyOKIl/RTQpRqhC0SvdyyxQIDAQAB】

3.从报文取出签名值sign:
【UDKYin8FiNt74XERScJ1/Aw9byEa7Zyc73B0wa3b+TB8zjGY1TiEFgjkt52yQa4l0QBPH7nPj/lxCkXJ3iNCbdtI33llRIbVRw6HSKokrKXRDhLtcC6mRAQxihVPQGCCHU0FaB5kyCDALExT15Liw2We4UPj2RhqTQcK2J+dFfAd/9y1op7652wUz4fTqeag1NnsWW4/8n9U/HCnOcgSKms1W2V/uKeITUu+xGD53Kc5FiuHfhKTncvE8r0d5yiuJIwwMHB1UtwMWb3lDptqfe4RyYIbLAmRZRr3C71Jrsd2buPt/Wfk+7g3bYDmXoLO0uqf/SWgQGj4j5SsAgJBpw==】

二、组成待验签串:
1.剔除空值参数:
【gmt_create=2018-04-20 17:50:32&charset=utf-8&seller_email=888@ymgxjy.com&subject=1元礼包&sign=UDKYin8FiNt74XERScJ1/Aw9byEa7Zyc73B0wa3b+TB8zjGY1TiEFgjkt52yQa4l0QBPH7nPj/lxCkXJ3iNCbdtI33llRIbVRw6HSKokrKXRDhLtcC6mRAQxihVPQGCCHU0FaB5kyCDALExT15Liw2We4UPj2RhqTQcK2J+dFfAd/9y1op7652wUz4fTqeag1NnsWW4/8n9U/HCnOcgSKms1W2V/uKeITUu+xGD53Kc5FiuHfhKTncvE8r0d5yiuJIwwMHB1UtwMWb3lDptqfe4RyYIbLAmRZRr3C71Jrsd2buPt/Wfk+7g3bYDmXoLO0uqf/SWgQGj4j5SsAgJBpw==&body=购买1元礼包&buyer_id=2088002909593621&invoice_amount=1.00¬ify_id=53d06fe330f23412ffadf96bedf4b2eksd&fund_bill_list=[{"amount":"1.00","fundChannel":"ALIPAYACCOUNT"}]¬ify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=1.00&app_id=2018041202546065&buyer_pay_amount=1.00&sign_type=RSA2&seller_id=2088031750966038&gmt_payment=2018-04-20 17:50:33¬ify_time=2018-04-20 17:54:23&version=1.0&out_trade_no=102&total_amount=1.00&trade_no=2018042021001004620551077378&auth_app_id=2018041202546065&buyer_logon_id=xie***@126.com&point_amount=0.00】

2.剔除sign、sign_type参数:
【gmt_create=2018-04-20 17:50:32&charset=utf-8&seller_email=888@ymgxjy.com&subject=1元礼包&body=购买1元礼包&buyer_id=2088002909593621&invoice_amount=1.00¬ify_id=53d06fe330f23412ffadf96bedf4b2eksd&fund_bill_list=[{"amount":"1.00","fundChannel":"ALIPAYACCOUNT"}]¬ify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=1.00&app_id=2018041202546065&buyer_pay_amount=1.00&seller_id=2088031750966038&gmt_payment=2018-04-20 17:50:33¬ify_time=2018-04-20 17:54:23&version=1.0&out_trade_no=102&total_amount=1.00&trade_no=2018042021001004620551077378&auth_app_id=2018041202546065&buyer_logon_id=xie***@126.com&point_amount=0.00】

3、排序:
【app_id=2018041202546065&auth_app_id=2018041202546065&body=购买1元礼包&buyer_id=2088002909593621&buyer_logon_id=xie***@126.com&buyer_pay_amount=1.00&charset=utf-8&fund_bill_list=[{"amount":"1.00","fundChannel":"ALIPAYACCOUNT"}]&gmt_create=2018-04-20 17:50:32&gmt_payment=2018-04-20 17:50:33&invoice_amount=1.00¬ify_id=53d06fe330f23412ffadf96bedf4b2eksd¬ify_time=2018-04-20 17:54:23¬ify_type=trade_status_sync&out_trade_no=102&point_amount=0.00&receipt_amount=1.00&seller_email=888@ymgxjy.com&seller_id=2088031750966038&subject=1元礼包&total_amount=1.00&trade_no=2018042021001004620551077378&trade_status=TRADE_SUCCESS&version=1.0】

三、验签结果:
【验签成功】




支付宝异步通知接口是用来接收支付宝服务器发送的交易状态信息的。下面是一个简单的示例代码: ```php <?php // 配置信息 $alipay_config = array( 'partner' => '208800XXXXXXXXXX', // 合作身份者id,以2088开头的16位数字。 'key' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', // 安全检验码,以数字和字母组成的32位字符。 'sign_type' => 'MD5', // 签名方式,目前支持RSA和MD5两种方式。 'input_charset' => 'utf-8', // 字符编码格式,目前支持GBK或UTF-8。 'cacert' => getcwd() . '\\cacert.pem', // CA证书路径地址,用于curl中ssl校验。 'transport' => 'http', // 访问模式,本例采用默认的curl实现。 ); // 异步通知参数 $notify_data = $_POST['notify_data']; // 创建支付宝通知对象 require_once('alipay_notify.class.php'); $alipayNotify = new AlipayNotify($alipay_config); // 验证签名 $verify_result = $alipayNotify->verifyNotify(); if ($verify_result) { // 验证成功 // 获取交易状态 $trade_status = $_POST['trade_status']; if ($trade_status == 'TRADE_FINISHED' || $trade_status == 'TRADE_SUCCESS') { // 处理交易成功逻辑 } else { // 处理交易失败逻辑 } echo 'success'; // 返回success告诉支付宝服务器已成功接收通知 } else { // 验证失败 echo 'fail'; // 返回fail告诉支付宝服务器接收通知失败 } ``` 在上面的代码中,我们使用了支付宝提供的 `alipay_notify.class.php` 类来验证签名和处理交易状态。如果验证成功,我们就可以根据交易状态进行相应的业务逻辑处理,并返回 `success` 通知支付宝服务器已成功接收通知。如果验证失败,则返回 `fail` 告诉支付宝服务器接收通知失败
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值