最近做了功能,涉及到了微信支付單筆轉賬功能,不得不說,支付寶的到款速度還是很給力。
首先必須要有去申請企業支付寶,這個東西需要營業執照,申請一般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
