API串接

Line Pay v3 串接 (Online)

參考API文件: https://pay.line.me/tw/developers/apis/apis?locale=zh_TW   先註冊Sandbox LINE Pay Developers : Sandbox creation 之後信箱會收到一組ID跟Password 這組帳密是用來登入LinePay商店的 LINE Pay 行動支付 登入後點擊右上角測試環境並切換繁體中文 點擊「管理付款連結」-> 「管理連結金鑰」 ->輸入登入的密碼 會拿到一組Channel ID與Channel Secret Key 這兩項是待會串接會需要的資料     準備動作完成,接下來開始進行串接 由於LINE PAY API用瀏覽器會有跨域問題,所以用後端Laravel來做     Online API 付款 ( 使用者掃描條碼並確認付款 )   API URL  $channelId = '上面拿到的ChannelId'; $key = '上面拿到的Secret Key'; $requestUrl = '/v3/payments/request'; //目前先把訂單寫死,每個欄位皆為必填並且格是必須一樣,注意orderId不能重複 //須注意商品價錢要對的起來不要算錯了  $order = [             'amount' => 100,             'currency' => 'TWD',             'orderId' => "asa81f5s2ass2fd12333",             'packages' => [                 [                     'id' => '202203311d2ef',                     'amount' => 100,                     'name' => '麥當勞六塊炸雞',                     'products' => [                         [                             'name' => "麥當勞六塊雞餐",                             'quantity' => 2,                             'price' => 50,                         ],                     ],                 ],             ],             'redirectUrls' => [                 'confirmUrl' => '', //使用者按下確認結帳後導向的網址,使用者成功付款時會將transactionId帶到這個網址的query,再利用這個confirmUrl取得transactionId來觸發Confirm API                 'cancelUrl' => '',//使用者按下取消結帳後導向的網址             ],      ];   //不重複的UUID or timestamp  $nonce = $this->create_uuid(); /***************UUID實作****************/ public static function create_uuid($prefix = "")     {         $chars = md5(uniqid(mt_rand(), true));         $uuid = substr($chars, 0, 8) . '-'         . substr($chars, 8, 4) . '-'         . substr($chars, 12, 4) . '-'         . substr($chars, 16, 4) . '-'         . substr($chars, 20, 12);         return $prefix . $uuid;     } /************************************/   接下來是重點,打這支API會驗證Header 其中的X-LINE-Authorization需要進行加密        $data = $key . $requestUrl . json_encode($order) . $nonce;        $hash = hash_hmac('sha256', $data, $key, true);        $hmacBase64 = base64_encode($hash); 接來下組合Header $headers = array(             'Content-Type:application/json',             'X-LINE-ChannelId:' . $channelId,             'X-LINE-Authorization-Nonce:' . $nonce,             'X-LINE-Authorization:' . $hmacBase64,    );   //要打API的網址 $url = "https://sandbox-api-pay.line.me" . $requestUrl;   //進行API $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($order)); $output = curl_exec($ch); return $output;   此時會收到web與app的網址,將使用者畫面導向這個網址即可到達付款頁面 如超過授權期限,這筆交易會進入後台交易失敗   接著必須帶上 transactionId 去打Confirm API 來請款   $channelId = env('LINEPAY_channelId');         $key = env('LINEPAY_SecretKey');         $requestUrl = '/v3/payments/' . $transactionId . '/confirm';         $nonce = $this->create_uuid();           $url = env('LINEPAY_URL') . $requestUrl;         $body = [             'amount' => $amount,             'currency' => 'TWD',         ];           $data = $key . $requestUrl . json_encode($body) . $nonce;         $hash = hash_hmac('sha256', $data, $key, true);         $hmacBase64 = base64_encode($hash);           $headers = array(             'Content-Type:application/json',             'X-LINE-ChannelId:' . $channelId,             'X-LINE-Authorization-Nonce:' . $nonce,             'X-LINE-Authorization:' . $hmacBase64,         );  $ch = curl_init();         curl_setopt($ch, CURLOPT_URL, $url);         curl_setopt($ch, CURLOPT_POST, true);         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);         curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);         curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body));         $output = curl_exec($ch); 出現以下回傳值才代表交易成功 此回傳格式為string 需使用json_decode才能取值   Online付款到這邊告一段落

2022-04-01

API串接

Line Pay v2 串接 (Offline)

由於Offline跟Online差別只有在API的部分,因此前面註冊Sandbox部分可參考Online做法 Line Pay v3 串接 (Online & Offline)   Online API 付款 ( 可由店家掃描客戶的條碼 )   Offline的API URL 與 Header規則   $channelId = 'LinePay後臺拿到的ChannelId'; $key = 'LinePay後臺拿到的Secret Key'; $url = 'https://sandbox-api-pay.line.me/v2/payments/oneTimeKeys/pay';   //這邊Header跟v3不一樣,比起來較簡單點 $headers = array(             'Content-Type:application/json',             'X-LINE-ChannelId:' . $channelId,             'X-LINE-ChannelSecret:' . $key, ); $body = [             'productName' => '商品測試',             'amount' => '20',             'currency' => 'TWD',             'orderId' => '2323sdsf2sd3fdg2332', //訂單編號,記得不要重複             'oneTimeKey' => '388176489952165252', //取得使用者的條碼內容,可參考下面的產生器,條碼授權時間有限 ]; /********************/ LinePay條碼產生器 付款給廠商 (line.me) /*********************/   //打api $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($body)); $output = curl_exec($ch); return $output; 基本上此時已付款完成 sandbox付款條碼產生器的點數購買勾選調,選項就不會寫信用卡。     假如等待時間過久,需要執行另一隻檢查API來查看交易狀況 $url = 'https://sandbox-api-pay.line.me/v2/payments/orders/' . $orderId . '/check'; Header的部分跟上面一模一樣,只不過方法是用Get $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $output = curl_exec($ch); return $output;   若超過20分鐘這筆交易將會被歸類為交易失敗   //查看已請款訂單 $url = 'https://sandbox-api-pay.line.me/v2/payments?orderId=' . $orderId . '&transactionId=' . $transactionId; transactionId為成功付款後回傳的項目 Header部分跟上面一樣,方法同樣是使用Get $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $output = curl_exec($ch); return $output;

2022-04-01

API串接

Laravel實作Line Notify串接

1. 登入Line Notify官方網頁 LINE Notify   2. 右上方選擇「管理登錄服務」,並點「發行存取權杖(開發人員用)」   3. 選擇要置入的群組 備註:權杖名稱為傳送訊息的Title   4. 接著會取得一段Token,這個要記好,假如忘了就只能在重新跑一次流程。   -------串接實作------- 這邊使用Laravel來實作 1.  在env把剛剛的Token設定好 LINE_NOTIFY_TOKEN = 剛剛的Token   2.建立一個Controller public function LineNotify($msg){         //API需要的驗證資訊         $headers = array(             'Content-Type: application/x-www-form-urlencoded',             //剛剛在env設定的參數名稱(LINE_NOTIFY_TOKEN)             'Authorization: Bearer ' . env('LINE_NOTIFY_TOKEN'),         );         $url = 'https://notify-api.line.me/api/notify';         //msg為要通知的訊息         $body = array(             'message' => $msg,         );         $ch = curl_init();         $params = array(             CURLOPT_URL => $url,             CURLOPT_RETURNTRANSFER => true,             CURLOPT_HTTPHEADER => $headers,             CURLOPT_SSL_VERIFYPEER => false,             CURLOPT_CONNECTTIMEOUT => 3,             CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13',             CURLOPT_CUSTOMREQUEST => 'POST',             CURLOPT_POSTFIELDS => http_build_query($body),         );         curl_setopt_array($ch, $params);         if (!$result = curl_exec($ch)) {             if ($errno = curl_errno($ch)) {                 $error_message = curl_strerror($errno);                 echo "cURL error ({$errno}):\n {$error_message}";                 curl_close($ch);                 return false;             }         } else {             curl_close($ch);             return true;         } }   3. 接著在別的function呼叫就可以了 $this->LineNotify($msg);          

2021-12-29