第三方支付,微信支付及支付宝的一些入门了解
B2C電商的支付,一般由于支付金額比較小,支付比較頻繁,所以一般采用第三方支付,常用的第三方支付有:支付寶、微信、易寶支付等。他們的原理都差不多。都是在點擊支付時,直接調(diào)用第三方支付接口,傳入appid、appsecret、訂單編號、訂單金額、回調(diào)url,直接跳轉(zhuǎn)到第三方支付頁面,接下來的支付過程,我們都不需要管,支付成功以后,第三方支付平臺會直接回調(diào)我們的url。給我們返回:狀態(tài)碼、訂單編號、支付流水號三個參數(shù)。我們首先根據(jù)訂單編號,找到我們的訂單,把支付流水號和狀態(tài)碼更新到我們的訂單里邊。回調(diào)url,一般有兩種,一種用同步get方法回調(diào),一種用異步的類似ajax方法回調(diào),同步方法回調(diào),一般是成功以后才會回調(diào),并且只回調(diào)一次,回調(diào)成功以后我們可以直接跳轉(zhuǎn)到我們的支付成功頁面、異步方法回調(diào),一般要求我們返回一個success字符串,第三方平臺如果沒有接受到success,就會認(rèn)為沒有調(diào)用成功,他會重復(fù)多次調(diào)用。比如支付寶會在25小時之內(nèi),調(diào)用8次;一般情況下第三方支付都采用第二種方式,因為比較安全,但支付寶是同時采用了兩種。
 我之前接觸過一個B2B的電商,他們由于交易金額比較大,第三方支付無法實現(xiàn),所以是直接和銀行對接。大體上是,首先平臺和銀行簽訂合同,銀行為平臺開設(shè)一個總賬號,當(dāng)企業(yè)在平臺注冊以后,平臺會為企業(yè)調(diào)用銀行接口,創(chuàng)建一個子賬號,這個子張?zhí)柺菕煸诳傎~號下邊的,也是一個在銀行實際存在的賬號,但是,只能通過外部銀行卡給里邊轉(zhuǎn)賬,而不能給外部銀行卡轉(zhuǎn)出。可以在子行號直接互相轉(zhuǎn)賬。
 微信掃描支付
 1、商戶系統(tǒng)根據(jù)用戶選擇的商品生成訂單(此步驟不分析)
 2、用戶確認(rèn)支付后根據(jù)微信【統(tǒng)一下單API】,向微信支付系統(tǒng)發(fā)出請求(我們通過httpclient方式請求的)
 分析:商戶確認(rèn)支付即點擊“結(jié)算”按鈕跳轉(zhuǎn)到收銀臺,然后在點擊微信支付時,會調(diào)用商戶系統(tǒng)后臺,后臺做處理準(zhǔn)備微信需要的參數(shù),然后通過httpclient調(diào)用微信的【統(tǒng)一下單API:https://api.mch.weixin.qq.com/pay/unifiedorder】,其中需要準(zhǔn)備的主要參數(shù):
 appid(公眾號ID),String(32),微信支付分配的公眾號ID
 商戶號(mch_id),String(32),微信支付分配的商戶號
 隨機字符串(nonce_str),String(32),隨機字符串,主要是為了保證簽名不可預(yù)測
 簽名(sign),String(32),通過簽名算法得到的簽名值,簽名算法大致為:需要參與的字段包含公眾號、商戶號、隨機字符串、一些其他字段,最重要是key(在微信支付系統(tǒng)中配置的密鑰),然后這些字段格式為:key1=value1&key2=value2…,然后把這個字符串通過MD5加密并把加密結(jié)果轉(zhuǎn)成大寫。
 商戶訂單號(out_trade_no),String(32),商戶系統(tǒng)內(nèi)部訂單號,我們系統(tǒng)用的是交易流水號(訂單號-商戶號-時間戳)
 標(biāo)價金額(total_fee),int,訂單總金額,單位為分,不能帶小數(shù)點
 通知地址(notify_url),String(256),異步接收微信支付結(jié)果通知的回調(diào)地址,必須為外網(wǎng)能訪問的URL,不能帶參數(shù)
 交易類型(trade_type),String(16),JSAPI–公眾號支付、NATIVE–原生掃碼支付、APP–app支付,我們用的是NATIVE
 3、微信支付系統(tǒng)收到請求后,先生成預(yù)支付訂單,然后給商戶系統(tǒng)返回二維碼連接
 4、商戶系統(tǒng)拿到返回值字符串,轉(zhuǎn)換成對象,然后取出二維碼連接生成二維碼
 5、用戶通過微信“掃一掃”功能掃描二維碼,微信客戶端將掃碼內(nèi)容發(fā)送到微信支付系統(tǒng)
 6、微信支付系統(tǒng)接收到支付請求,驗證鏈接有效性后發(fā)起支付,請求客戶確認(rèn),然后我們的微 信端就會彈出需要確認(rèn)支付的頁面
 7、用戶輸入密碼,確認(rèn)支付并提交授權(quán)
 8、微信支付系統(tǒng)根據(jù)用戶授權(quán)完成交易
 9、微信支付系統(tǒng)支付成功后向微信客戶端返回交易結(jié)果,并將交易結(jié)果通過短信、微信提示用戶
 10、微信支付系統(tǒng)通過發(fā)送異步消息通知商戶系統(tǒng)后臺支付結(jié)果,商戶系統(tǒng)需回復(fù)接收情況,通 知微信支付系統(tǒng)不再發(fā)送該單的通知
 接收到微信的支付完成回調(diào)請求,微信支付系統(tǒng)會傳過來一個字符串,格式是xlm的我們將其轉(zhuǎn)換成map格式,然后驗證一些主要參數(shù),return_code和result_code均 為success;公眾號,商戶id不為空;對簽名進(jìn)行驗證,防止數(shù)據(jù)泄漏,驗證方法是將返回集解析出來,然后重新按照簽名規(guī)則生成簽名,將兩個新舊簽名比較,如果相同則驗證通過;以上驗證全部通過則認(rèn)為威信支付系統(tǒng)支付成功,接下來處理商戶系統(tǒng)。
 商戶系統(tǒng)也需要驗證一些支付異常情況,訂單已取消的支付成功了;訂單已經(jīng)支付了,重復(fù)支付;訂單金額不一致,支付金額與訂單金額不一致;以上均為異常支付,需要退款。如果無異常支付,則更新本地數(shù)據(jù)。另外商戶系統(tǒng)在進(jìn)行上述驗證及更新操作時,需將此段代碼加鎖,因為微信支付系統(tǒng)在與商戶系統(tǒng)交互時,如果微信收到的用戶應(yīng)答不是成功或超時,則認(rèn)為微信通知失敗,則微信會重新發(fā)起通知,通知頻率為:通知頻率為:15/15/30/180/1800/1800/1800/1800/3600,單位:秒
 11、未收到支付通知的情況,商戶系統(tǒng)可調(diào)用【查詢訂單APP】
 12、商戶確認(rèn)訂單已經(jīng)支付后給用戶發(fā)貨
 支付寶支付:
 一、流程:
 1、用戶請求支付,調(diào)用我方接口,我方根據(jù)訂單信息和商品信息構(gòu)造符合支付寶要求的請求參數(shù)(請求參數(shù)中具有一個我方的回調(diào)地址,當(dāng)支付成功的時候,支付寶會回調(diào)這個接口)去請求一個支付二維碼(可設(shè)置支付二維碼的過期時間)。我方將支付二維碼持久化到圖片服務(wù)器,然后圖片地址給前端,讓前端展示給用戶。
 2、剩下這一步就是用戶和支付寶的交互了。用戶支付成功后,支付寶回調(diào)我們的接口,我們的接口開始去更新訂單狀態(tài),寫支付信息到我們的數(shù)據(jù)庫中,如此一個完整的支付場景就完成了。支付寶會根據(jù)我們返回的值,判斷這次交易是否成功,不成功則不扣錢。
 二、難點
 1、如何確保是支付寶回調(diào)的我們的接口?
 如果是被惡意的第三方調(diào)用我們的接口,并且通過了將訂單狀態(tài)更新了,那么就相當(dāng)于我們形成了損失。
 支付寶自身提供了一套校驗機制(這套校驗機制是怎么做的,值得學(xué)習(xí)),我們可以通過調(diào)用支付寶的校驗接口去校驗回調(diào)是否來自支付寶。
 2、如何保證冪等性?
 如果是因為網(wǎng)絡(luò)原因、用戶多次點擊。那么要保證這些操作造成的結(jié)果是一致的。
 我的處理方案:先去數(shù)據(jù)庫中查詢狀態(tài),如果狀態(tài)是訂單已支付,那么返回支付已完成的消息,否則去更新訂單信息。
 缺點:如果正在更新狀態(tài),一個請求又過來了,那么還是不能保證冪等性。
 改進(jìn):使用一個全局分布式鎖,每次要進(jìn)行這個操作(其中還是有查詢狀態(tài)這個操作),去持有這個分布式鎖,執(zhí)行成功之后去釋放這個分布式鎖(這是為了避免高并發(fā)帶來的問題)。
總結(jié)
以上是生活随笔為你收集整理的第三方支付,微信支付及支付宝的一些入门了解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 计算机科学丛书(2014-2018.Q1
- 下一篇: (转)CRC校验算法详解
