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