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;
}
}
到这里大功告成!骚年!