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