支付寶的demo:https://docs.open.alipay.com/270/106291/
一般是在notify_url 異步通知 里寫業(yè)務(wù)代碼船惨。return_url只做付款成功后展示頁厅各。
要點
notify_url 要能直接訪問到,不能有登錄密碼之類
寫完后發(fā)現(xiàn)成功返回return_url,卻進入不了notify_url的post庇楞,原來是外部無法訪問钦无,果斷禁用登錄訪問
public $enableCsrfValidation = false; //關(guān)閉csrf驗證,允許表單多次提交
public $layout=false; //禁用框架祠汇,包括不登錄無法訪問功能
controller
public function actionServermoney1()
{
$thirdid = Yii::$app->user->identity->thirdid;
$money = 0.01;
$randstr = RechargeController::getrandstr();
$out_trade_no = 'servermoney' . $randstr . '-' . time();
$models = new IbdThirdServicemoney();
$models->money = $money*100;
$models->time = time();
$models->thirdid = $thirdid;
$models->status = 0;
$models->tradeno = $out_trade_no;
$models->save();
//構(gòu)造參數(shù)
$payRequestBuilder = new \AlipayTradePagePayContentBuilder();
$payRequestBuilder->setSubject('開通服務(wù)費');
$payRequestBuilder->setTotalAmount($money);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$config=Yii::$app->params['config2'];
$aop = new \AlipayTradeService($config);
/**
* pagePay 電腦網(wǎng)站支付請求
* @param $builder 業(yè)務(wù)參數(shù)仍秤,使用buildmodel中的對象生成。
* @param $return_url 同步跳轉(zhuǎn)地址座哩,公網(wǎng)可以訪問
* @param $notify_url 異步通知地址徒扶,公網(wǎng)可以訪問
* @return $response 支付寶返回的信息
*/
$response = $aop->pagePay($payRequestBuilder, $config['return_url'], $config['notify_url']);
$json["status"] = 1;
$json["data"] = $response;
var_dump($response);
die;
}
params
'config2'=>[
'app_id' => "支付寶app_id",
'merchant_private_key' => "key1",
'notify_url' => "網(wǎng)站地址/third/notice/alinotify",
'return_url' => "網(wǎng)站地址/third/recharge/alireturn",
'charset' => "UTF-8",
'sign_type'=>"RSA2",
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
'alipay_public_key' => "key2",
],
NoticeController
<?php
namespace third\controllers;
use common\models\GIm;
use Yii;
use \yii\filters\AccessControl;
use \yii\web\Controller;
require_once dirname(dirname(__DIR__)) . '/vendor/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';
require_once dirname(dirname(__DIR__)) . '/vendor/alipay/pagepay/service/AlipayTradeService.php';
class NoticeController extends Controller{
public $enableCsrfValidation = false;
public $layout=false; //重寫這個屬性就可以了 [yii2]不加載layout布局文件的實現(xiàn)方法
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error','view','alinotify'],
'allow' => true,
],
[
'actions' => ['view','alinotify'],
'allow' => true,
'roles' => ['@'],
],
],
],
];
}
/**
* @inheritdoc
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
public function actionAlinotify(){
//獲取回調(diào)參數(shù),這里是以post傳值
$data=Yii::$app->request->post();
//獲取配置參數(shù)
$config=Yii::$app->params['config2'];
//實例化service對象
$serviceobj= new \AlipayTradeService($config);
//驗證數(shù)據(jù)是否為支付寶返回
$result=$serviceobj->check($data);
if($result){
//成功
if($data['trade_status']=="TRADE_SUCCESS"){
//業(yè)務(wù)代碼
}
}else{
echo "fail";
}
}
}