第三方支付 回调失败 同步返回通知与异步通知区别解析 同步返回参数和同步响应参数的区别 异步通知参数是直接由支付宝服务器发送到商户的异步地址上的 不存在页面跳转是直接的服务器交互


 

第三方支付 回调通知款项收到 通知失败

 

失败原因  

己方服务器对通知信息的处理发生了异常

 

 

支付结果通知

应用场景

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。

对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)

注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。

推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。

特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。

技术人员可登进微信商户后台扫描加入接口报警群。

 

查询订单

应用场景

该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。

需要调用查询接口的情况:

  1. ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
  2. ◆ 调用支付接口后,返回系统错误或未知交易状态情况;
  3. ◆ 调用刷卡支付API,返回USERPAYING的状态;
  4. ◆ 调用关单或撤销接口API之前,需确认支付状态;

接口链接

https://api.mch.weixin.qq.com/pay/orderquery

 

蚂蚁金服开发者社区 一,什么是同步通知     同步通知是指在请 经验交流 同步返回通知与异步通知区别解析 1 https://openclub.alipay.com/read.php?tid=7335&fid=72&page=1

同步返回通知与异步通知区别解析

 
来自       其他 | 
作者:天籁  |  更新于:2018-06-20 15:30:35     

一,什么是同步通知

 

  同步通知是指在请求参数中传入return_url参数,支付成功后跳转到return_url地址后携带的返回参数,如下可以在同步跳转的地址栏看到同步返通知:

return_url参数 后面?拼接的就是同步返回参数。

 

注:目前在支付接口中只有手机网站支付的接口和电脑网站支付的接口可以传入return_url参数 来接收到同步通知 其他的支付接口 如APP支付和当面付的接口都是不支持的。

 

二、什么是异步返通知

  异步通知是指在请求参数中传入notify_url参数,在用户支付成功后,支付宝服务器会按照这个异步地址使用post方式给notify_url来发送交易信息,如下:

gmt_create=2018-06-19[/url] 10:45:21&charset=UTF-8&seller_email=$$$&subject=使用充值:0.01元&sign=$$$&body=欢迎使用&buyer_id=2088902846029999&invoice_amount=0.01&notify_id=fa5f28482957168bb30be6230000bb7m3l&fund_bill_list=[{"amount":"0.01","fundChannel":"ALIPAYACCOUNT"}]&notify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=0.01&app_id=2018061260369999&buyer_pay_amount=0.01&sign_type=RSA2&seller_id=2088131465899999&gmt_payment=2018-06-19 10:45:22&notify_time=2018-06-19 10:59:12&passback_params=1007511859282415616&version=1.0&out_trade_no=20180619109999&total_amount=0.01&trade_no=2018061921001004790596169999&auth_app_id=2018061260369999&buyer_logon_id=124***@qq.com&point_amount=0.00

 

notify_url地址由商户自己定义保证可以正常使用外网post方式访问,否则是无法正常接收到异步通知的。

三、同步通知和异步通知的区别

  1、接收方法不同

     同步通知是在同步返回的页面使用get方式来获取的 异步通知是使用post方式发送到异步地址上的,只能使用post方式来接收。

 

  2、返回的参数不同

   同步通知返回的参数比异步通知返回的参数是要少一些的,最明显的就是异步返回参数会返回trade_status(交易状态)参数 但是同步返回的参数是没有的,所以建议使用异步返回的参数来确认交易是否成功 如果trade_status=TRADE_SUCCESS表示就是交易成功了

 

  3、发送的时间不同

     一般情况下,异步通知比同步通知稍慢(几乎无感知)。同步和异步通知的发送和网络环境、服务器处理速度等因素关系较大,具体是先接收到同步通知还是异步通知,建议以实际接收到的为准。

 

  4、参数返回的逻辑不一样

   (1.)同步通知是在支付成功后的页面跳转,一般是用于展示给用户的,以手机网站支付为例:

   付款成功会跳转到商户请求参数中传入的return_url地址页面:

(2.)异步通知参数是直接由支付宝服务器发送到商户的异步地址上的 不存在页面跳转是直接的服务器交互。

 

四、关于验签

  同步通知和异步通知都是使用相同的验签方法验签的,如果是调用的SDK那就是都是使用的rsaCheckV1方法。

 

  详细的验签建议参考:

  关于支付宝异步通知的那些事:https://openclub.alipay.com/read.php?tid=1314&fid=69&ant_source=zsearch

  验签失败自查方案:https://openclub.alipay.com/read.php?tid=1598&fid=69

 

注:同步通知参数和同步响应参数是不一样的,同步通知返回是return_url参数返回的信息,同步响应则是请求成功接口返回的信息

      详细的建议参考:https://openclub.alipay.com/read.php?tid=7328&fid=69

 

 

同步响应参数验签示例(Java)

 
来自       签名与验签 | 
作者:天籁  |  更新于:2018-06-20 11:34:37     

一、同步返回参数和同步响应参数的区别

 

  1.同步返回的参数是指在接口的请求参数中传入return_url参数,在支付成功后在return_url地址后面返回的如:

https://m.alipay.com/Gk8NF23?total_amount=9.00&timestamp=2016-08-11+19%3A36%3A01&sign=ErCRRVmW%2FvXu1XO76k%2BUr4gYKC5%2FWgZGSo%2FR7nbL%2FPU7yFXtQJ2CjYPcqumxcYYB5x%2FzaRJXWBLN3jJXr01Icph8AZGEmwNuzvfezRoWny6%2Fm0iVQf7hfgn66z2yRfXtRSqtSTQWhjMa5YXE7MBMKFruIclYVTlfWDN30Cw7k%2Fk%3D&trade_no=2016081121001004630200142207&sign_type=RSA2&charset=UTF-8&seller_id=2088111111116894&method=alipay.trade.wap.pay.return&app_id=2016040501024706&out_trade_no=70501111111S001111119&version=1.0 

 

 2.同步响应的参数是指调用接口,接口响应的参数,以退款接口的响应参数为例:

{"alipay_trade_refund_response":{"code":"10000","msg":"Success","buyer_logon_id":"dvr***@sandbox.com","buyer_user_id":"2088102174881929","fund_change":"Y","gmt_refund_pay":"2018-06-20 10:51:02","out_trade_no":"2018620104753419","refund_fee":"0.01","send_back_fee":"0.00","trade_no":"2018062021001004920200514505"},"sign":"A/XC4scJe8dF/Gv29g/dzf6bkBtz5H0pnv4eDZzEpz/0QFlQFNqk9dSS072MTZMbZO1h9M//8PntWCNPRQAEYdkS4vBVcHPbJnDkdFjD75bI/ZwXZEJaH4OWmkV4vvJD4/K1MVXLRXpiKtzwVMPGyBn0L2YvfIi3I/5dOGPYwI2sq6NalCfJydr3dwJ4Jf36Od/5jnofMv0IE2joyReywQhL45vOtGzsJhvJ5WUsxezuyK3UJ4SXmy6dNZb1qGRNlYeoaLiKTQ50GOpe7IdQsBOFz88Tg/DcqRgbrTak97A3WOYiTWG2HgD5nRWOmHrQ6KdJbfiYzYSfkjUmwly19g=="}

 

二、验签

注意:开放平台SDK封装了同步返回响应参数的验签方法,只需在创建DefaultAlipayClient对象进行初始化,设置请求网关(gateway),应用id(app_id),应用私钥(private_key),编码格式(charset),支付宝公钥(alipay_public_key),签名类型(sign_type)即可,同步返回响应参数报文时会自动进行验签。

 

同步返回的参数和同步响应的参数都是可以使用SDK封装的

boolean flag = AlipaySignature.rsaCheckV1(params, alipaypublicKey, charset,"RSA2")

方法来验签,params参数就是同步响应或是返回的参数 但是同步响应的参数是json格式的 在处理的时候如果处理不好可能会导致验签失败,此时建议大家可以使用下面的方法来验证同步的响应参数

 

1、使用RSA格式的秘钥验签同步响应参数,以上面的退款同步的响应参数为例:

//处理返回的信息
String content="{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"dvr***@sandbox.com\",\"buyer_user_id\":\"2088102174881929\",\"fund_change\":\"Y\",\"gmt_refund_pay\":\"2018-06-20 10:51:02\",\"out_trade_no\":\"2018620104753419\",\"refund_fee\":\"0.01\",\"send_back_fee\":\"0.00\",\"trade_no\":\"2018062021001004920200514505\"}";
//传入支付宝公钥
String publicKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1SvGfJX2+z3RK4IPVI9ob3V+Q7hS8Zjo/yeUzHlkzyZ2ifq1KGxpOUYNK+UpkDxpMfy9xDWp94FWfMgug3VfsbhH/3YQFuMe4JJ/d5MIWA7zEqd4mWxFIL8UcQWMkpn+JmN6LJrT3ByrSjQ6fkaxc2sEB5rw87AOnW6JzLbWOKT4s1cXg6FK+DgHGhkMixIdIRwN43xycbrl2NYzR/iN2b7beyxhKRmQS0JFhGRGk7TQ02iuCoDe8228l1Khd8NuqWEJ4B31d1iSeUEZUmFxI/l3Aq9fb/ylwB3xjON6h5yG4jm+ntGHUUw09HQ4HegZsepUdnTZ5zYuCCSwwKHUqQIDAQAB";
//传入项目编码的格式
String charset="UTF-8";
//取出返回的响应参数的sign参数
String sign="A/XC4scJe8dF/Gv29g/dzf6bkBtz5H0pnv4eDZzEpz/0QFlQFNqk9dSS072MTZMbZO1h9M//8PntWCNPRQAEYdkS4vBVcHPbJnDkdFjD75bI/ZwXZEJaH4OWmkV4vvJD4/K1MVXLRXpiKtzwVMPGyBn0L2YvfIi3I/5dOGPYwI2sq6NalCfJydr3dwJ4Jf36Od/5jnofMv0IE2joyReywQhL45vOtGzsJhvJ5WUsxezuyK3UJ4SXmy6dNZb1qGRNlYeoaLiKTQ50GOpe7IdQsBOFz88Tg/DcqRgbrTak97A3WOYiTWG2HgD5nRWOmHrQ6KdJbfiYzYSfkjUmwly19g==";
//传入验签使用的秘钥的格式		
String signType="RSA";
			
boolean re=	AlipaySignature.rsaCheck(content, sign, publicKey, charset, signType);

 

2、使用RSA2格式的秘钥验签同步响应参数,同样以上面的退款同步的响应参数为例:

 //处理返回的信息
String content="{\"code\":\"10000\",\"msg\":\"Success\",\"buyer_logon_id\":\"dvr***@sandbox.com\",\"buyer_user_id\":\"2088102174881929\",\"fund_change\":\"Y\",\"gmt_refund_pay\":\"2018-06-20 10:51:02\",\"out_trade_no\":\"2018620104753419\",\"refund_fee\":\"0.01\",\"send_back_fee\":\"0.00\",\"trade_no\":\"2018062021001004920200514505\"}";
//传入支付宝公钥
String publicKey="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1SvGfJX2+z3RK4IPVI9ob3V+Q7hS8Zjo/yeUzHlkzyZ2ifq1KGxpOUYNK+UpkDxpMfy9xDWp94FWfMgug3VfsbhH/3YQFuMe4JJ/d5MIWA7zEqd4mWxFIL8UcQWMkpn+JmN6LJrT3ByrSjQ6fkaxc2sEB5rw87AOnW6JzLbWOKT4s1cXg6FK+DgHGhkMixIdIRwN43xycbrl2NYzR/iN2b7beyxhKRmQS0JFhGRGk7TQ02iuCoDe8228l1Khd8NuqWEJ4B31d1iSeUEZUmFxI/l3Aq9fb/ylwB3xjON6h5yG4jm+ntGHUUw09HQ4HegZsepUdnTZ5zYuCCSwwKHUqQIDAQAB";
//传入项目编码的格式
String charset="UTF-8";
//取出返回的响应参数的sign参数
String sign="A/XC4scJe8dF/Gv29g/dzf6bkBtz5H0pnv4eDZzEpz/0QFlQFNqk9dSS072MTZMbZO1h9M//8PntWCNPRQAEYdkS4vBVcHPbJnDkdFjD75bI/ZwXZEJaH4OWmkV4vvJD4/K1MVXLRXpiKtzwVMPGyBn0L2YvfIi3I/5dOGPYwI2sq6NalCfJydr3dwJ4Jf36Od/5jnofMv0IE2joyReywQhL45vOtGzsJhvJ5WUsxezuyK3UJ4SXmy6dNZb1qGRNlYeoaLiKTQ50GOpe7IdQsBOFz88Tg/DcqRgbrTak97A3WOYiTWG2HgD5nRWOmHrQ6KdJbfiYzYSfkjUmwly19g==";

boolean req=AlipaySignature.rsa256CheckContent(content, sign, publicKey,charset);

 

 

注意:

1、这边的是使用RSA验签还是RSA2 是依据商户自己请求的时候使用的秘钥格式是RSA还是RSA2来确定的 只能使用对应的格式的秘钥来验签,否则就会验签失败  这边示例的退款的请求信息中我这边使用的是RSA2的秘钥 所以使用RSA的验签代码就会验签失败的 建议只参考传参方式  如果使用RSA2的秘钥格式来验签是可以成功的 

2、返回的响应参数中已带有反斜杠,需转义处理,需使用两个反斜杠进行标记,如扫码支付返回参数信息。

 

如有其它疑问欢迎大家可以在本帖后发帖追问。

 

 

 

 

 

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM