使用API介面方式呼叫電腦Alipay網站支付功能
阿新 • • 發佈:2018-12-19
其實真是的支付寶支付閘道器和支付寶沙箱只是提交地址不同,如果是沙箱吧沙箱地址填寫上去,如果是正式的環境請把真實的支付寶閘道器填寫上去;
支付寶沙箱閘道器:https://openapi.alipaydev.com/gateway.do
支付寶正式閘道器:https://openapi.alipay.com/gateway.do
一,主頁填寫各種引數
新建一個pay.php檔案
<?php #使用者私鑰 $pri_key = ''; #引入簽名 include './Rsa.php'; //公共請求引數 $arr = [ #appid 'app_id' => '', 'method' => 'alipay.trade.page.pay', #同步地址 'return_url' => '', #非同步地址 'notify_url' => '', 'charset' => 'utf-8', 'sign_type' => 'RSA2', 'timestamp' => date('Y-m-d H:i:s'), 'version' => '1.0', 'biz_content' => '', ]; //業務請求引數 $arr_params = [ #訂單名稱 'subject'=>'', #使用者唯一訂單號 'out_trade_no'=> '', #價格 'total_amount'=>'', 'product_code'=>'FAST_INSTANT_TRADE_PAY', ]; $arr['biz_content'] = json_encode($arr_params,JSON_UNESCAPED_UNICODE); ksort($arr); $str = urldecode(http_build_query($arr)); $rsa = new RSA(); $arr['sign'] = $rsa->rsaSign($str, $pri_key); header('location:https://openapi.alipaydev.com/gateway.do?' . http_build_query($arr));
二,類檔案驗證公鑰,私鑰
再建立一個Rsa.php
<?php class RSA { /** * RSA簽名 * @param $data 待簽名資料 * @param $private_key 私鑰字串 * return 簽名結果 */ function rsaSign($data, $private_key) { $search = [ "-----BEGIN RSA PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----" ]; $private_key=str_replace($search,"",$private_key); $private_key=$search[0] . PHP_EOL . wordwrap($private_key, 64, "\n", true) . PHP_EOL . $search[1]; $res=openssl_get_privatekey($private_key); if($res) { openssl_sign($data, $sign,$res,OPENSSL_ALGO_SHA256); openssl_free_key($res); }else { exit("私鑰格式有誤"); } $sign = base64_encode($sign); return $sign; } /** * RSA驗籤 * @param $data 待簽名資料 * @param $public_key 公鑰字串 * @param $sign 要校對的的簽名結果 * return 驗證結果 */ function rsaCheck($data, $public_key, $sign) { $search = [ "-----BEGIN PUBLIC KEY-----", "-----END PUBLIC KEY-----" ]; $public_key=str_replace($search,"",$public_key); $public_key=$search[0] . PHP_EOL . wordwrap($public_key, 64, "\n", true) . PHP_EOL . $search[1]; $res=openssl_get_publickey($public_key); if($res) { $result = (bool)openssl_verify($data, base64_decode($sign), $res,OPENSSL_ALGO_SHA256); openssl_free_key($res); }else{ exit("公鑰格式有誤!"); } return $result; } }
三,驗證支付寶公鑰,私鑰
最後非同步登入過程新建一個notify.php
<?php #支付寶公鑰 $pub_key = ''; include './Rsa.php'; $params = $_POST; $sign = $params['sign']; unset($params['sign']); unset($params['sign_type']); ksort($params); $str = urldecode(http_build_query($params)); $rsa = new RSA(); $stat = $rsa->rsaCheck($str, $pub_key, $sign); if($stat){ //判斷支付狀態 // $params['trade_status'] == 'TRADE_SUCCESS' || $params['trade_status'] == 'TRADE_FINISHED' // //根據訂單號 判斷訂單金額是否一致 //app_id //update order stat 更新訂單狀態 echo 'success'; }else{ } //獲取支付寶傳送的資料 //除去sign、sign_type //排序 //拼接字串 //使用公鑰驗籤