close

創建一個全新 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." 就表示數據有成功傳送過去
image

arrow
arrow
    文章標籤
    [.Net][C#] LinePay v3
    全站熱搜

    s1239743 發表在 痞客邦 留言(0) 人氣()