Blogger Information
Blog 33
fans 0
comment 0
visits 25859
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
thinkphp整合系列之支付宝MD5加密方式扫码支付
非常缪
Original
1051 people have browsed it

一:导入sdk
/ThinkPHP/Library/Vendor/Alipay
需要说明的是;这个sdk原本是担保支付的;
后来被我改成即时到账的;
所以;如果如果按我这篇文章整合;就需要下载示例项目;
然后拷贝Alipay了;
二:配置项
/Application/Common/Conf/config.php    'ALIPAY_CONFIG'          => array(
       'partner'            => '', // partner 从支付宝商户版个人中心获取
       'seller_email'       => '', // email 从支付宝商户版个人中心获取
       'key'                => '', // key 从支付宝商户版个人中心获取
       'sign_type'          => strtoupper(trim('MD5')), // 可选md5  和 RSA
       'input_charset'      => 'utf-8', // 编码 (固定值不用改)
       'transport'          => 'http', // 协议  (固定值不用改)
       'cacert'             => VENDOR_PATH.'Alipay/cacert.pem',  // cacert.pem存放的位置 (固定值不用改)
       'notify_url'         => 'https://byao.com/Api/Alipay/alipay_notify', // 异步接收支付状态通知的链接
       'return_url'         => 'https://byao.com/Api/Alipay/alipay_return', // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。 (扫码支付专用)
       'show_url'           => 'https://byao.com/User/Order/index', // 商品展示网址,收银台页面上,商品展示的超链接。 (扫码支付专用)
       'private_key_path'   => '', //移动端生成的私有key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用)
       'public_key_path'    => '', //移动端生成的公共key文件存放于服务器的 绝对路径 如果为MD5加密方式;此项可为空 (移动支付专用)
       ),
PHPCopy

好吧;注释我已经写的比较清楚了;今个我们讲的是pc端的扫码支付;
可以先无视private_key_path、public_key_path这两个参数;其他的就是填空题了;
三:支付函数
/Application/Common/Common/function.php

/**
* 跳向支付宝付款
* @param  array $order 订单数据 必须包含 out_trade_no(订单号)、price(订单金额)、subject(商品名称标题)
*/function alipay($order){
   vendor('Alipay.AlipaySubmit','','.class.php');
   // 获取配置
   $config=C('ALIPAY_CONFIG');
   $data=array(
       "_input_charset" => $config['input_charset'], // 编码格式
       "logistics_fee" => "0.00", // 物流费用
       "logistics_payment" => "SELLER_PAY", // 物流支付方式SELLER_PAY(卖家承担运费)、BUYER_PAY(买家承担运费)
       "logistics_type" => "EXPRESS", // 物流类型EXPRESS(快递)、POST(平邮)、EMS(EMS)
       "notify_url" => $config['notify_url'], // 异步接收支付状态通知的链接
       "out_trade_no" => $order['out_trade_no'], // 订单号
       "partner" => $config['partner'], // partner 从支付宝商户版个人中心获取
       "payment_type" => "1", // 支付类型对应请求时的 payment_type 参数,原样返回。固定设置为1即可
       "price" => $order['price'], // 订单价格单位为元
       // "price" => 0.01, // // 调价用于测试
       "quantity" => "1", // price、quantity 能代替 total_fee。 即存在 total_fee,就不能存在 price 和 quantity;存在 price、quantity, 就不能存在 total_fee。 (没绕明白;好吧;那无视这个参数即可)
       "receive_address" => '1', // 收货人地址 即时到账方式无视此参数即可
       "receive_mobile" => '1', // 收货人手机号码 即时到账方式无视即可
       "receive_name" => '1', // 收货人姓名 即时到账方式无视即可
       "receive_zip" => '1', // 收货人邮编 即时到账方式无视即可
       "return_url" => $config['return_url'], // 页面跳转 同步通知 页面路径 支付宝处理完请求后,当前页面自 动跳转到商户网站里指定页面的 http 路径。
       "seller_email" => $config['seller_email'], // email 从支付宝商户版个人中心获取
       "service" => "create_direct_pay_by_user", // 接口名称 固定设置为create_direct_pay_by_user
       "show_url" => $config['show_url'], // 商品展示网址,收银台页面上,商品展示的超链接。
       "subject" => $order['subject'] // 商品名称商品的标题/交易标题/订单标 题/订单关键字等
   );
   $alipay=new \AlipaySubmit($config);
   $new=$alipay->buildRequestPara($data);
   $go_pay=$alipay->buildRequestForm($new, 'get','支付');
   echo $go_pay;}
PHPCopy

同样;看注释就行了;
调用方法;

$data=array(
   'out_trade_no'=>time(),
   'price'=>1,
   'subject'=>'测试'
   );alipay($data);
PHPCopy

如果你这填空题做的不错的话;到这已经跳到支付宝付款页面了;
四:同步接收通知
/Application/Api/Controller/AlipayController.class.php

    * return_url接收页面     */
   public function alipay_return(){
       // 引入支付宝
       vendor('Alipay.AlipayNotify','','.class.php');
       $config=$config=C('ALIPAY_CONFIG');
       $notify=new \AlipayNotify($config);
       // 验证支付数据
       $status=$notify->verifyReturn();
       if($status){
           // 下面写验证通过的逻辑 比如说更改订单状态等等 $_GET['out_trade_no'] 为订单号;
           $this->success('支付成功',U('User/Order/index'));
       }else{
           $this->success('支付失败',U('User/Order/index'));
       }
   }
PHPCopy

经过第三步支付成功后;支付宝是会带着一堆get参数跳向配置项中的return_url给的url;
然后在这里写接收通知的逻辑;
五:异步接收通知
/Application/Api/Controller/AlipayController.class.php

   /**
    * notify_url接收页面
    */
   public function alipay_notify(){
       // 引入支付宝
       vendor('Alipay.AlipayNotify','','.class.php');
       $config=$config=C('ALIPAY_CONFIG');
       $alipayNotify = new \AlipayNotify($config);
       // 验证支付数据
       $verify_result = $alipayNotify->verifyNotify();
       if($verify_result) {
           echo "success";
           // 下面写验证通过的逻辑 比如说更改订单状态等等 $_POST['out_trade_no'] 为订单号;

       }else {
           echo "fail";
       }
   }
PHPCopy

正常流程中;第四步就已经结束了;
但是呢;很多时候因为各种原因;比如说用户支付成功后还没等支付宝跳转就关掉了窗口;
等等原因;在支付成功后并没有成功跳转回return_url指定的url
这时候就是notify_url这个发挥作用的时候了;
支付宝会按照一定的频率往我们的服务器发送异步post的支付结果通知;
我们把处理支付成功后的业务逻辑在这也放一份就可以了;
//*****************关于不知道怎么查看异步发过来的数据的补充*****************
2016.10.28:
好多童鞋在问支付后;不知道怎么查看接收到的支付状态通知;
这里做个补充;首先;我们的服务器必须是外网可以正常访问到的;
必须注意不能有 登录或者权限之类的拦截;
另外补充一个简单的查看收到的内容的方法用于测试;
/Application/Api/Controller/AlipayController.class.php

   /**
    * notify_url接收页面
    */
   public function alipay_notify(){
       // 下面的file_put_contents是用来简单查看异步发过来的数据 测试完可以删除;
       file_put_contents('./notify.text', json_encode($_POST));
       // 引入支付宝
       vendor('Alipay.AlipayNotify','','.class.php');
       $config=$config=C('ALIPAY_CONFIG');
       $alipayNotify = new \AlipayNotify($config);
       // 验证支付数据
       $verify_result = $alipayNotify->verifyNotify();
       if($verify_result) {
           echo "success";
           // 下面写验证通过的逻辑 比如说更改订单状态等等 $_POST['out_trade_no'] 为订单号;

       }else {
           echo "fail";
       }
   }
PHPCopy

//*****************关于可能出现ILLEGAL_SIGN错误的解放方案*****************
示例项目中的 function.php 中顶部是有设置编码的:

header("Content-type:text/html;charset=utf-8");
PHPCopy

如果整合到自己的项目中;记得添加上这句;


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!