php接入支付寶的流程寫在這裡供像我一樣的小白參考。
1.首先要有一個建立一個應用(選好自己想要的功能,關于支付的功能,貌似都需要簽約)
2.下載下傳SDK&Dome(網址https://opendocs.alipay.com/open/270/106291)

把下載下傳下來的檔案解壓的網站根目錄
首先我們要先找到 config.php
把我們的appi_id,'merchant_private_key',alipay_public_key,這三項配置正确,如何擷取從網上就可以找到
然後在本地都可以跑通的情況下把sdk都放到Yii2項目中的 vendor/alipay中
再把config.php 中的 notify_url 設定成我們可以用外網可以通路的位址 ,這個 參數是異步處理資料的位址
我們改參數時一定要注意 千萬不用多任何東西跟增加換行跟空格 否則很容易驗證簽名不通過
都修改完畢後,我們來寫業務代碼 這裡 我将調用pagepay的方法寫到了Payment的靜态方法alipay中
require_once '../../vendor/alipay/pagepay/service/AlipayTradeService.php';
require_once '../../vendor/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
class Payment
{
public static function aliPay($price,$order,$type=[])
{
require_once("../../vendor/alipay/config.php");
//商戶訂單号,商戶網站訂單系統中唯一訂單号,必填
$out_trade_no = $order;
//訂單名稱,必填
$subject = '餘額充值';
$body = '稿件交易餘額充值';
//付款金額,必填
$total_amount = $price;
//商品描述,可空
//構造參數
$payRequestBuilder = new \AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$payRequestBuilder->setPassbackParams(urlencode(json_encode($type)));
$aop = new \AlipayTradeService($config);
/**
* pagePay 電腦網站支付請求
* @param $builder 業務參數,使用buildmodel中的對象生成。
* @param $return_url 同步跳轉位址,公網可以通路
* @param $notify_url 異步通知位址,公網可以通路
* @return $response 支付寶傳回的資訊
*/
$aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
}
}
/**
* 建立訂單号2q
* @param string $prefix
* @return string
*/
public static function createOrderSn($prefix ='',$number=18){
$string = $prefix.date('ymdHsi',time());
$str_number = $number - strlen($string);
$string .= self::get_millisecond(rand(0,$str_number));
$string = str_pad($string,$number,"0");
$str_number = strlen($string);
if($str_number > $number){
return substr($string,0,$number);
}
return $string ;
}
/**
* 擷取微妙
* @param int $mumber 不能大于8
* @return mixed
*/
private static function get_millisecond($number = 8)
{
if ($number > 8) { $number = 8; }
list($usec, $time) = explode(" ", microtime());
$msec = $usec * 100000000 + rand(0,99)+ rand(0,999)+rand(0,9999)+rand(0,$usec)+rand(0,$usec);
$string = str_pad($msec,$number , "0");
$str_number = strlen($string);
if($str_number > $number){
return substr($string,0,$number);
}
return $string;
}
控制器代碼
public function actionIndex()
{ $price = Yii::$app->getRequest()->get('price');
Payment::aliPay($price,Payment::createOrderSn('ZFB'));
}
在這裡很重要我們看看前台代碼
因為我們背景請求支付寶借口時他傳回的是一個頁面,是以我們在這裡需要這麼做才可以用vue調用支付寶支付頁面
pay(){
this.$axios
.get('pay-ment/index',{
params:{
pay_type:this.pay_type,
price:this.price,
}
})
.then(res => {
document.querySelector('body').innerHTML = res.data; //查找到目前頁面的body,将背景傳回的form替換掉他的内容
document.forms[0].submit();
}
})
},
我們掃碼付款完成以後 需要在我們配置檔案中的異步位址中進行背景資料修改,同步位址進行跳轉
//支付寶異步通知
public function actionNotify()
{
require_once '../../vendor/alipay/pagepay/service/AlipayTradeService.php';
require_once("../../vendor/alipay/config.php");
$arr = Yii::$app->request->post();
// Yii::info("",'pay');
$alipaySevice = new \AlipayTradeService($config);
$alipaySevice->writeLog(var_export($arr,true)); //支付寶帶的寫日志的函數
$result = $alipaySevice->check($arr);
if($result) {//驗證成功
//商戶訂單号
$out_trade_no = $_POST['out_trade_no'];
//支付寶交易号
$trade_no = $_POST['trade_no'];
//交易狀态
$trade_status = $_POST['trade_status'];
//交易金額
$total_amount = $_POST['total_amount'];
//自己傳的值
$passback_params = json_decode(urldecode($_POST['passback_params']),true);
$passback_params['out_trade_no'] = $out_trade_no;
$time = time();
if($trade_status == 'TRADE_FINISHED') {
//我們的業務代碼
}
else if ($trade_status == 'TRADE_SUCCESS') {
//我們的業務代碼
}
}else {
$fail_msg = implode(',', $arr);
Yii::warning("驗證失敗$fail_msg",'pay');
//驗證失敗
echo "fail";die;
}
}
到這裡大功告成!騷年!