|
綠界SERVER回傳得知
- 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比對如下
- HASH_KEY = 'xxxxxx'
- HASH_IV = 'xxxxxxxxxxx'
- ecPayData = request.form
- ecPayData_toStr = ecPayData.to_dict()
- print("ecPayData_toStr:",ecPayData_toStr)
- # output: 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')])
- ecPayReturn_CheckMacValue = ecPayData_toStr.pop("CheckMacValue")
- print("ecPayData_toStr_C:", ecPayData_toStr)
- # 3. 依照 Key 的字母順序排序
- sorted_keys = sorted(ecPayData_toStr.keys(), key=str.lower)
- print(f"步驟2: 排序後的鍵 (Key) -> \n{sorted_keys}\n")
- # 4. 將排序後的參數重新組合成字串
- sorted_payload = '&'.join([f"{key}={ecPayData_toStr[key]}" for key in sorted_keys])
- print(f"步驟3: 重新組合的字串 -> \n{sorted_payload}\n")
- # 5. 加上 HashKey 和 HashIV
- string_to_hash = f"HashKey={HASH_KEY}&{sorted_payload}&HashIV={HASH_IV}"
- print(f"步驟4: 加上 HashKey 和 HashIV -> \n{string_to_hash}\n")
- # 6. 進行 URL encode
- sMacValue = urllib.parse.quote_plus(string_to_hash)
- print(f"步驟5: URL Encode -> \n{sMacValue}\n")
- # 7. 轉為小寫
- sMacValue = sMacValue.lower()
- print(f"步驟6: 轉小寫 -> \n{sMacValue}\n")
- # 8. 替換為與 .NET 相符的特殊字元
- sMacValue = sMacValue.replace('%2d', '-')
- sMacValue = sMacValue.replace('%5f', '_')
- sMacValue = sMacValue.replace('%2e', '.')
- sMacValue = sMacValue.replace('%21', '!')
- sMacValue = sMacValue.replace('%2a', '*')
- sMacValue = sMacValue.replace('%28', '(')
- sMacValue = sMacValue.replace('%29', ')')
- print(f"步驟7: 替換特殊字元 -> \n{sMacValue}\n")
- # 9. 以 SHA256 方式加密
- sMacValue = hashlib.sha256(sMacValue.encode('utf-8')).hexdigest()
- print(f"步驟8: SHA256 加密 -> \n{sMacValue}\n")
- # 10. 轉為大寫,產生最終的 CheckMacValue
- sMacValue = sMacValue.upper()
- print(f"步驟9: 轉為大寫 (最終 CheckMacValue) -> \n{sMacValue}\n")
- CheckMacValue = sMacValue
- if CheckMacValue == ecPayReturn_CheckMacValue:
複製代碼
已測試成功.........
文章來源:NetYea 網頁設計
|
|