1. 程式人生 > >使用API介面方式呼叫電腦Alipay網站支付功能

使用API介面方式呼叫電腦Alipay網站支付功能

其實真是的支付寶支付閘道器和支付寶沙箱只是提交地址不同,如果是沙箱吧沙箱地址填寫上去,如果是正式的環境請把真實的支付寶閘道器填寫上去;

支付寶沙箱閘道器: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
//排序
//拼接字串 
//使用公鑰驗籤