iT邦幫忙

0

從第三方支付平台回傳資料,驗證,再存到資料庫

當支付完成將會已post收到以下數值
MerchantID MerchantTradeNo
RtnCode RtnMsg
TradeNo TradeAmt
PaymentDate PaymentType
PaymentTypeChargeFee TradeDate
SimulatePaid CheckMacValue
其中針對CheckMacValue來作確認, 計算方式如下.

步驟一.將以上數值處理成以下狀態, 再在最前面加上HashKey=A123456789012345, 最後面加上HashIV=B123456789012345. 注意!!!! CheckMavValue不加入以下計算
完成品如下, 舉例數值都為111

HashKey=A123456789012345&MerchantID=111&MerchantTradeNo=111&RtnCode=111&RtnMsg=111&TradeNo=111&TradeAmt=111&PaymentDate=111&PaymentType=111&PaymentTypeChargeFee=111&TradeDate=111&SimulatePaid=111&HashIV=B123456789012345

步驟二, 將以上代碼作UrlEncode

HashKey%3dA123456789012345%26MerchantID%3d111%26MerchantTradeNo%3d111%26RtnCode%3d111%26RtnMsg%3d111%26TradeNo%3d111%26TradeAmt%3d111%26PaymentDate%3d111%26PaymentType%3d111%26PaymentTypeChargeFee%3d111%26TradeDate%3d111%26SimulatePaid%3d111%26HashIV%3dB123456789012345

步驟三, 轉為小寫

hashkey%3da123456789012345%26merchantid%3d111%26merchanttradeno%3d111%26rtncode%3d111%26rtnmsg%3d111%26tradeno%3d111%26tradeamt%3d111%26paymentdate%3d111%26paymenttype%3d111%26paymenttypechargefee%3d111%26tradedate%3d111%26simulatepaid%3d111%26hashiv%3db123456789012345

步驟四, 將以上代碼作大寫MD5

0E56DFDB0B806EBCF172ABB1D46E4A28

以下為需要的幫助

  1. 如果收到的資料中 CheckMacValue=驗算過後的MD5
  2. 將ID, GetState, MerchantTradeNo(另外一發問的$my_tradeno), RtnCode, TradeNo, TradeAmt, PaymentDate, PaymentType, PaymentTypeChar, TradeDate, SimulatePaid
    這些value依序紀錄到資料庫secura裡的make_money資料表裡面所對應的名稱.
    另外不知道 ID為依序排序, GetState為預設 這兩個數值是不是直接在資料庫預設數值就好?
看更多先前的討論...收起先前的討論...

0E56DFDB0B806EBCF172ABB1D46E4A28



在繼續請教其他高手前
我想提醒你一點
你兩篇問題中的MD5值是不同的
也就代表「CheckMacValue=驗算過後的MD5」是永遠不會成立的
原因是
這篇裡的步驟三和另一篇的步驟二中
你拿去做MD5的資料是不同的
(一篇是只將key=value的value部份轉小寫;另一篇是全部都轉小寫)
你可能要先決定是那種做法才是對的
否則一切可能都只是做白工

期待好心的高手為你解答你的問題

真不好意思 真沒注意到這點。
正確的計算是要全部小寫後再MD5,
謝謝你的發現。
fillano iT邦超人 1 級 ‧ 2014-02-24 12:11:56 檢舉
歐付寶的API文件應該還算清楚耶?你的問題好像比較是卡在PHP不熟XD(從上一篇的問題來看)

金流介接在系統中頗重要,你不能用更熟悉的程式語言來做嗎?
暈
被你發現了,是寫的非常清楚,但是真的不會PHP,
想說剛好可以拿來試試看怎麼寫出來這些東西。

不試還好,試了都是一堆不會解的題。

1 個回答

2
fillano
iT邦超人 1 級 ‧ 2014-02-24 12:30:14

joey09533225提到:
MerchantTradeNo

應該是你跟歐付寶都會知道的資料,所以在送出資料給歐付寶之前,就應該存進資料庫。如果這個資料使用循序的數字,那可以用mysql的auto_increment來產生。如果是自訂的訂單號,那要想辦法避免重複,例如可以用日期加流水號來做,但是在產生前到存入完成需要lock table。

基本上這是一個訂單,建議你從訂單的角度來思怎麼設計,資料怎麼存放。不要只從金流的角度來思考。

ReturnURL收到資料時,就根據傳來的MerchantTradeNo到資料庫查詢,然後組出你的CheckMacValue來跟歐付寶傳來的做比對,正確的才更新資料庫。

回覆數值1或OK時,只要echo就可以。

看更多先前的回應...收起先前的回應...

大師你好,這才想起如果是隨機的號碼是有機率會重複的。
但我想要嘗試的是只需要將正確付款完成的資料給寫入資料庫,因為有其他的程序會需要調用此資料。
關於訂單的編號我會考慮用循序數字或是其他方式來生成,訂單的資料我想我要再額外新增一個資料表來紀錄訂單的部分,有紀錄的話至少需要時可調用。

我會繼續嘗試寫出CheckMacValue計算的php code.

fillano iT邦超人 1 級 ‧ 2014-02-24 16:55:17 檢舉

有一個陷阱,就是必須依照參數的順序組出CheckMacValue,所以接到$_POST以後,你要用ksort來排序,然後將CheckMacValue之外的參數與值組合成他要求的樣子。

fillano提到:
你要用ksort來排序

其實這段程式碼只要寫一次
在另一篇和這一篇就可以重覆使用
1.準備參數
2.將參數組在一起
3.URLEncode
4.轉小寫
5.計算出MD5值

fillano iT邦超人 1 級 ‧ 2014-02-25 11:25:57 檢舉

他所有接值都會傳CheckMacValue,而且演算法一樣。做成函數或類別方法來重複使用會比較好。

我要發表回答

立即登入回答