找回密碼
 註冊
搜索
查看: 174|回復: 0

[教學] ecpay 綠界如何編碼 CheckMacValue

[複製鏈接]
發表於 前天 23:19 | 顯示全部樓層 |閱讀模式
Push to Facebook

綠界SERVER回傳得知
  1. ImmutableMultiDict([('AlipayID', ''), ('AlipayTradeNo', ''), ('amount', '80800'), ('ATMAccBank', ''), ('ATMAccNo', ''), ('auth_code', '777777'), ('card4no', '2222'), ('card6no', '431195'), ('CustomField1', ''), ('CustomField2', ''), ('CustomField3', ''), ('CustomField4', ''), ('eci', '0'), ('ExecTimes', ''), ('Frequency', ''), ('gwsr', '13955622'), ('MerchantID', '3002607'), ('MerchantTradeNo', '2025101423404152'), ('PayFrom', ''), ('PaymentDate', '2025/10/14 23:35:34'), ('PaymentNo', ''), ('PaymentType', 'Credit_CreditCard'), ('PaymentTypeChargeFee', '1981'), ('PeriodAmount', ''), ('PeriodType', ''), ('process_date', '2025/10/14 23:35:34'), ('red_dan', '0'), ('red_de_amt', '0'), ('red_ok_amt', '0'), ('red_yet', '0'), ('RtnCode', '1'), ('RtnMsg', '交æ<98><93>æ<88><90>å<8a><9f>'), ('SimulatePaid', '0'), ('staed', '0'), ('stage', '0'), ('stast', '0'), ('StoreID', ''), ('TenpayTradeNo', ''), ('TotalSuccessAmount', ''), ('TotalSuccessTimes', ''), ('TradeAmt', '80800'), ('TradeDate', '2025/10/14 23:35:01'), ('TradeNo', '2510142335016248'), ('WebATMAccBank', ''), ('WebATMAccNo', ''), ('WebATMBankName', ''), ('CheckMacValue', 'EE759D314B59ACB73C8B9129620F90964D78C3EDE06B2661C63BB984AC41AC3E')])
複製代碼


得知要編出CheckMacValue與ECPAY給的CheckMacValue比對如下


  1.     HASH_KEY = 'xxxxxx'
  2.     HASH_IV = 'xxxxxxxxxxx'
  3.     ecPayData = request.form
  4.     ecPayData_toStr = ecPayData.to_dict()
  5.     print("ecPayData_toStr:",ecPayData_toStr)

  6.     # output: ImmutableMultiDict(
  7.     #     [('AlipayID', ''), ('AlipayTradeNo', ''), ('amount', '80800'), ('ATMAccBank', ''), ('ATMAccNo', ''),
  8.     #      ('auth_code', '777777'), ('card4no', '2222'), ('card6no', '431195'), ('CustomField1', ''),
  9.     #      ('CustomField2', ''), ('CustomField3', ''), ('CustomField4', ''), ('eci', '0'), ('ExecTimes', ''),
  10.     #      ('Frequency', ''), ('gwsr', '13955622'), ('MerchantID', '3002607'), ('MerchantTradeNo', '2025101423404152'),
  11.     #      ('PayFrom', ''), ('PaymentDate', '2025/10/14 23:35:34'), ('PaymentNo', ''),
  12.     #      ('PaymentType', 'Credit_CreditCard'), ('PaymentTypeChargeFee', '1981'), ('PeriodAmount', ''),
  13.     #      ('PeriodType', ''), ('process_date', '2025/10/14 23:35:34'), ('red_dan', '0'), ('red_de_amt', '0'),
  14.     #      ('red_ok_amt', '0'), ('red_yet', '0'), ('RtnCode', '1'), ('RtnMsg', '交æ<98><93>æ<88><90>å<8a><9f>'),
  15.     #      ('SimulatePaid', '0'), ('staed', '0'), ('stage', '0'), ('stast', '0'), ('StoreID', ''), ('TenpayTradeNo', ''),
  16.     #      ('TotalSuccessAmount', ''), ('TotalSuccessTimes', ''), ('TradeAmt', '80800'),
  17.     #      ('TradeDate', '2025/10/14 23:35:01'), ('TradeNo', '2510142335016248'), ('WebATMAccBank', ''),
  18.     #      ('WebATMAccNo', ''), ('WebATMBankName', ''),
  19.     #      ('CheckMacValue', 'EE759D314B59ACB73C8B9129620F90964D78C3EDE06B2661C63BB984AC41AC3E')])

  20.     ecPayReturn_CheckMacValue = ecPayData_toStr.pop("CheckMacValue")
  21.     print("ecPayData_toStr_C:", ecPayData_toStr)

  22.     # 3. 依照 Key 的字母順序排序
  23.     sorted_keys = sorted(ecPayData_toStr.keys(), key=str.lower)
  24.     print(f"步驟2: 排序後的鍵 (Key) -> \n{sorted_keys}\n")

  25.     # 4. 將排序後的參數重新組合成字串
  26.     sorted_payload = '&'.join([f"{key}={ecPayData_toStr[key]}" for key in sorted_keys])
  27.     print(f"步驟3: 重新組合的字串 -> \n{sorted_payload}\n")
  28.     # 5. 加上 HashKey 和 HashIV

  29.     string_to_hash = f"HashKey={HASH_KEY}&{sorted_payload}&HashIV={HASH_IV}"
  30.     print(f"步驟4: 加上 HashKey 和 HashIV -> \n{string_to_hash}\n")

  31.     # 6. 進行 URL encode
  32.     sMacValue = urllib.parse.quote_plus(string_to_hash)
  33.     print(f"步驟5: URL Encode -> \n{sMacValue}\n")
  34.     # 7. 轉為小寫

  35.     sMacValue = sMacValue.lower()
  36.     print(f"步驟6: 轉小寫 -> \n{sMacValue}\n")

  37.     # 8. 替換為與 .NET 相符的特殊字元
  38.     sMacValue = sMacValue.replace('%2d', '-')
  39.     sMacValue = sMacValue.replace('%5f', '_')
  40.     sMacValue = sMacValue.replace('%2e', '.')
  41.     sMacValue = sMacValue.replace('%21', '!')
  42.     sMacValue = sMacValue.replace('%2a', '*')
  43.     sMacValue = sMacValue.replace('%28', '(')
  44.     sMacValue = sMacValue.replace('%29', ')')
  45.     print(f"步驟7: 替換特殊字元 -> \n{sMacValue}\n")

  46.     # 9. 以 SHA256 方式加密
  47.     sMacValue = hashlib.sha256(sMacValue.encode('utf-8')).hexdigest()
  48.     print(f"步驟8: SHA256 加密 -> \n{sMacValue}\n")

  49.     # 10. 轉為大寫,產生最終的 CheckMacValue
  50.     sMacValue = sMacValue.upper()
  51.     print(f"步驟9: 轉為大寫 (最終 CheckMacValue) -> \n{sMacValue}\n")
  52.     CheckMacValue = sMacValue

  53.     if CheckMacValue == ecPayReturn_CheckMacValue:
複製代碼

已測試成功.........

文章來源:NetYea 網頁設計
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

Archiver|手機版|小黑屋|TShopping

GMT+8, 2025-10-17 04:19 , Processed in 0.018046 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表