支付寶單筆轉賬支付功能


最近做了功能,涉及到了微信支付單筆轉賬功能,不得不說,支付寶的到款速度還是很給力。

首先必須要有去申請企業支付寶,這個東西需要營業執照,申請一般1-2天即可申請完畢,最后還會有個對公賬號打款8.22元。現在我們主要說下程序方面的實現

第一,首先需要建立一個開發者應用,會分配你一個appid

2,進行相對應的功能應用進行簽約,時間一般一天就可以通過

3,填寫公鑰,公鑰這塊用支付寶提供的工具生成即可。

 

4以上執行完畢后,我們就可以根據文檔進行功能開發

5.請求地址  https://openapi.alipay.com/gateway.do

,通過文檔,我們知道其實我們就把相應的參數(公共請求參數和請求參數)發給支付寶

6.支付寶接受到參數會給我們相應的反饋,在請求參數時,我們會把所有的請求參數json后放入到公共參數 biz_content中,具體參看下面代碼

    

<?php
require_once '../zhifubao/Rsa.class.php';
require_once '../zhifubao/Base.class.php';
require_once '../zhifubao/Alipay.class.php';
//構建支付請求 可以傳遞MD5 RSA RSA2三種參數
$obj = new Alipay();

$data = [
    'payee_account'  => 'xxxxx', //收款方賬戶
    'amount'  => 'xxxx', //金額
];

//UTF-8格式的json數據
$res = iconv('gbk','utf-8',$obj->transfer($data));


echo '<pre>';
//轉換為數組
$res = json_decode($res,true);

print_r($res);

  

 

 

 

  alipay類

<?php
class Alipay extends Base
{
    const TRANSFER = 'https://openapi.alipay.com/gateway.do';

    public function __construct() {


    }

    //轉賬
    public function transfer($data){
        //公共請求參數
        $pub_params = [
            'app_id'    => self::APPID,
            'method'    =>  'alipay.fund.trans.toaccount.transfer', //接口名稱 應填寫固定值alipay.fund.trans.toaccount.transfer
            'format'    =>  'JSON', //目前僅支持JSON
            'charset'    =>  'UTF-8',
            'sign_type'    =>  'RSA2',//簽名方式
            'sign'    =>  '', //簽名
            'timestamp'    => date('Y-m-d H:i:s'), //發送時間 格式0000-00-00 00:00:00
            'version'    =>  '1.0', //固定為1.0
            'biz_content'    =>  '', //業務請求參數的集合
        ];

        //請求參數
        $api_params = [
            'out_biz_no'  => date('YmdHis'),//商戶轉賬訂單號
            'payee_type'  => 'ALIPAY_LOGONID', //收款方賬戶類型
            'payee_account'  => $data['payee_account'], //收款方賬戶
            'amount'  => $data['amount'], //金額
        ];
        $pub_params['biz_content'] = json_encode($api_params,JSON_UNESCAPED_UNICODE);
        $pub_params =  $this->setRsa2Sign($pub_params);
        return $this->curlRequest(self::TRANSFER, $pub_params);
    }
}

  Base類

<?php
class Base extends RSA
{
/**
* 以下信息需要根據自己實際情況修改
*/
//自己的私鑰
const APPPRIKEY = 'xxxxx'; //修改成自己的 應用私鑰
//申請到的APPID
const APPID = 'xxxxx';
//支付寶公鑰,不是你自己生成的公鑰
const NEW_ALIPUBKE ='xxxx'; //修改成自己的 支付寶公鑰

public function getStr($arr,$type = 'RSA'){
    //篩選
    if(isset($arr['sign'])){
    unset($arr['sign']);
    }
    if(isset($arr['sign_type']) && $type == 'RSA'){
    unset($arr['sign_type']);
    }
    //排序
    ksort($arr);
    //拼接
    return  $this->getUrl($arr,false);
}
//將數組轉換為url格式的字符串
public function getUrl($arr,$encode = true){
    if($encode){
    return http_build_query($arr);
    }else{
    return urldecode(http_build_query($arr));
    }
}

//獲取簽名RSA2
public function getRsa2Sign($arr){
    return $this->rsaSign($this->getStr($arr,'RSA2'), self::APPPRIKEY,'RSA2') ;
}
//獲取含有簽名的數組RSA
public function setRsa2Sign($arr){
    $arr['sign'] = $this->getRsa2Sign($arr);
    return $arr;
}
public function checkSign($arr){
    if($this->getRsa2Sign($arr) == $arr['sign']){
      return true;
    }else{
      return false;
    }
}

public function curlRequest($url,$data = ''){
    $ch = curl_init();
    $params[CURLOPT_URL] = $url;    //請求url地址
    $params[CURLOPT_HEADER] = false; //是否返回響應頭信息
    $params[CURLOPT_RETURNTRANSFER] = true; //是否將結果返回
    $params[CURLOPT_FOLLOWLOCATION] = true; //是否重定向
    $params[CURLOPT_TIMEOUT] = 30; //超時時間
    if(!empty($data)){
    $params[CURLOPT_POST] = true;
    $params[CURLOPT_POSTFIELDS] = $data;
    }
    $params[CURLOPT_SSL_VERIFYPEER] = false;//請求https時設置,還有其他解決方案
    $params[CURLOPT_SSL_VERIFYHOST] = false;//請求https時,其他方案查看其他博文
    curl_setopt_array($ch, $params); //傳入curl參數
    $content = curl_exec($ch); //執行
    curl_close($ch); //關閉連接
    return $content;
}

}

  

rsa 驗證類

<?php
class RSA
{
/**
* RSA簽名
* @param $data 待簽名數據
* @param $private_key 私鑰字符串
* return 簽名結果
*/
function rsaSign($data, $private_key,$type = 'RSA') {

$search = [
"-----BEGIN RSA PRIVATE KEY-----",
"-----END RSA PRIVATE KEY-----",
"\n",
"\r",
"\r\n"
];

$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)
{
if($type == 'RSA'){
openssl_sign($data, $sign,$res);
}elseif($type == 'RSA2'){
//OPENSSL_ALGO_SHA256
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,$type = 'RSA')  {
$search = [
"-----BEGIN PUBLIC KEY-----",
"-----END PUBLIC KEY-----",
"\n",
"\r",
"\r\n"
];
$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)
{
if($type == 'RSA'){
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
}elseif($type == 'RSA2'){
$result = (bool)openssl_verify($data, base64_decode($sign), $res,OPENSSL_ALGO_SHA256);
}
openssl_free_key($res);
}else{
exit("公鑰格式有誤!");
}
return $result;
}

}

  

 代碼已上傳csdn,可以下載查看

https://download.csdn.net/download/hanyudanei/10398119


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM