第三方支付 回調失敗 同步返回通知與異步通知區別解析 同步返回參數和同步響應參數的區別 異步通知參數是直接由支付寶服務器發送到商戶的異步地址上的 不存在頁面跳轉是直接的服務器交互


 

第三方支付 回調通知款項收到 通知失敗

 

失敗原因  

己方服務器對通知信息的處理發生了異常

 

 

支付結果通知

應用場景

支付完成后,微信會把相關支付結果和用戶信息發送給商戶,商戶需要接收處理,並返回應答。

對后台通知交互時,如果微信收到商戶的應答不是成功或超時,微信認為通知失敗,微信會通過一定的策略定期重新發起通知,盡可能提高通知的成功率,但微信不保證通知最終能成功。 (通知頻率為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