創建一個全新 Linepayv3.aspx後,在 Linepayv3.aspx.cs 作業
[共用變數]
string ChannelId = "XXXXXXXXXX", ChannelSecret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
string apiPay = "https://api-pay.line.me";
//string apiPay = "https://sandbox-api-pay.line.me";
string apiurl = "/v3/payments/request";
string reqJSON = "", ValueInToken = "", nonce = "", orderId = "";
string totalC = "", Signature = "", transId = "";
protected void Page_Load(object sender, EventArgs e)
{
// http -> https 沒加這行 [.Net] 好像會預設 TLS1.0 (->強制用 TLS1.2以上)
ServicePointManager.SecurityProtocol = (SecurityProtocolType)768 | (SecurityProtocolType)3072;
..........(略)
}
protected string HmacSHA256(string message, string key)
{
key = key ?? "";
var encoding = new System.Text.UTF8Encoding();
byte[] keyByte = encoding.GetBytes(key);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new HMACSHA256(keyByte))
{
byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
return Convert.ToBase64String(hashmessage);
}
}
protected void RequestAPI(string orderID)
{
//呼叫 訂單資料,須包含 總總(sum(單價x數量) + (運費)) / 運費 / 訂單編號
//呼叫 訂單子項資料,商品編號 / 商品名稱 / 數量 / 商品單價 / 商品主圖
// 取得 亂數隨機數
nonce = Guid.NewGuid().ToString();
// 使用LinQ 把上面的訂單資料串成 匿名object List
var reqJson = new
{
amount = Convert.ToInt32(totalC),
currency = "TWD",
orderId = orderID,
packages = new List<object>
{
new {
id = orderID,
amount = Convert.ToInt32(totalC),
products = from oi in objList
.AsEnumerable()
.Select((oi, index) => new
{
id = (index + 1),
name = "商品Name",
imageUrl = "imageUrl",
quantity = 1,
price = "商品Cash"
})
select oi
}
},
redirectUrls = new
{
confirmUrl = "使用者付款後導向此頁"
,cancelUrl = "使用者取消付款後導向此頁"
}
};
ValueInToken = JsonConvert.SerializeObject(reqJson);
Signature = webLib.HmacSHA256((ChannelSecret + apiurl + ValueInToken + nonce), ChannelSecret);
// 設定 POST 到 LinePay 界街網址(※注意是測試環境或正式環境)
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(apiPay + apiurl);
httpWebRequest.ContentType = "application/json; charset=UTF-8";
httpWebRequest.Method = "POST";
httpWebRequest.Headers.Add("X-LINE-ChannelId", ChannelId);
httpWebRequest.Headers.Add("X-LINE-Authorization", Signature);
httpWebRequest.Headers.Add("X-LINE-Authorization-Nonce", nonce);
using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
streamWriter.Write(ValueInToken);
streamWriter.Flush();
streamWriter.Close();
}
var response = (HttpWebResponse)httpWebRequest.GetResponse();
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
var backModel = JsonConvert.DeserializeObject(responseString);
Response.Write("backModel= " + backModel.ToString() + "<br />");
// 最後增加自動跳轉到 LinePay介面
// jsonObj = [returnCode, returnMessage, info[paymentUrl[web,App],transactionId,paymentAccessToken]]
string linePayUrl="";
JObject jsonObj = JObject.Parse(backModel.ToString());
if (jsonObj["returnCode"].ToString() =="0000")
{
linePayUrl = jsonObj["info"]["paymentUrl"]["web"].ToString();
Response.Write("<script>location.href='" + linePayUrl + "'; </script>");
}
}
如果執行後有看到: "returnCode": "0000", "returnMessage": "Success." 就表示數據有成功傳送過去