---
# System prepended metadata

title: 綠界問題
tags: [C#]

---

---
title: '綠界問題'
tags: 綠界問題
description: 2023/08/29
---

綠界問題
===
[ToC]

綠界問題
---
* 以下是我 post 給綠界，<span class="red">**綠界 api 回傳**</span>的參數內容
* 測試環境 api：`https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5`
```PHP=
array(
  "AlipayID" => null
  "AlipayTradeNo" => null
  "amount" => "1000"
  "ATMAccBank" => null
  "ATMAccNo" => null
  "auth_code" => "777777"
  "card4no" => "2222"
  "card6no" => "431195"
  "CustomField1" => null
  "CustomField2" => null
  "CustomField3" => null
  "CustomField4" => null
  "eci" => "0"
  "ExecTimes" => null
  "Frequency" => null
  "gwsr" => "12793002"
  "MerchantID" => "2000132"
  "MerchantTradeNo" => "ECPay1693271370"
  "PayFrom" => null
  "PaymentDate" => "2023/08/29 09:11:00"
  "PaymentNo" => null
  "PaymentType" => "Credit_CreditCard"
  "PaymentTypeChargeFee" => "20"
  "PeriodAmount" => null
  "PeriodType" => null
  "process_date" => "2023/08/29 09:11:00"
  "red_dan" => "0"
  "red_de_amt" => "0"
  "red_ok_amt" => "0"
  "red_yet" => "0"
  "RtnCode" => "1"
  "RtnMsg" => "Succeeded"
  "SimulatePaid" => "0"
  "staed" => "0"
  "stage" => "0"
  "stast" => "0"
  "StoreID" => null
  "TenpayTradeNo" => null
  "TotalSuccessAmount" => null
  "TotalSuccessTimes" => null
  "TradeAmt" => "1000"
  "TradeDate" => "2023/08/29 09:09:32"
  "TradeNo" => "2308290909327284"
  "WebATMAccBank" => null
  "WebATMAccNo" => null
  "WebATMBankName" => null
  "CheckMacValue" =>  "F73AFA6CE619312B0EABFCF768BD2BFC0D6CDF954AE56D752EA55AB183EC938B"
)
```

這是您上次給我參考的 "產生檢查碼" code
```php=
private function getMacValue($hash_key, $hash_iv, $form_array) //產生檢查碼
{
    $encode_str = "HashKey=" . $hash_key;
    foreach ($form_array as $key => $value)
    {
        $encode_str .= "&" . $key . "=" . $value;
    }
    $encode_str .= "&HashIV=" . $hash_iv;
    $encode_str = strtolower(urlencode($encode_str));
    $encode_str = $this->replaceChar($encode_str);
    //MD5加密
    //return strtoupper(md5($encode_str));
    //SHA256加密
    return strtoupper(hash('sha256' ,$encode_str));
}	
private function merchantSort($a,$b) //仿自然排序法
{
    return strcasecmp($a, $b);
}
private function replaceChar($value) //特殊字元置換
{
    $search_list = array('%2d', '%5f', '%2e', '%21', '%2a', '%2A', '%28', '%29');
    $replace_list = array('-', '_', '.', '!', '*' , '*', '(', ')');
    $value = str_replace($search_list, $replace_list ,$value);
    return $value;
}
```

==問題 : [綠界文件 : 付款 / 付款結果通知](https://developers.ecpay.com.tw/?p=2878)==
==(如下第 10、11 行結果) <span class="red">**得到的檢查碼不一樣...**</span>，可是確有交易成功 ??==  
==請問這樣的 "比對檢查碼" 寫法對嗎 ??==

(第 6 行) $request->all( ) 為綠界回傳的 array...，使之變成檢查碼...
```php=
public function callback(Request $request)
{
    $hash_key = "5294y06JbISpM5x9"; //HashKey
    $hash_iv = "v77hoKGq4kWxNNIS"; //HashIV

    // 檢查碼 : $request->all() 即綠界回傳的 array
    $aaa = $request->all();
    uksort($aaa, array($this, "merchantSort"));

    $get_CheckMacValue = $this->getMacValue($hash_key, $hash_iv, $aaa);
    dd( $aaa['CheckMacValue'], $get_CheckMacValue )
}

// $aaa['CheckMacValue'] 得到 F73AFA6CE619312B0EABFCF768BD2BFC0D6CDF954AE56D752EA55AB183EC938B
// $get_CheckMacValue 得到 D23626466BF5440A8264EA83D7E979141342BA485A0F1D4807459D930021B3A2
```



<style>
.red {
  color: red;
}
.green {
  color: green;
}
</style>
