Laravel使用EasyWechat,3分钟完成微信APP支付

来源:互联网 发布:怎么查淘宝等级 编辑:程序博客网 时间:2024/05/16 15:45

一.准备工作

1.下载微信官方PHP的SDK,里面有个rootca.pem要用到,在php.ini里配置curl.cainfo=你存放rootca.pem的绝对路径,重启PHP

2.composer集成easywechat的laravel版本,具体怎么使用点这里

[plain] view plain copy print?
  1. composer require "overtrue/laravel-wechat:~3.0"  


二.创建控制器WechatController.php

[php] view plain copy print?
  1. <?php  
  2.   
  3. namespace App\Http\Controllers;  
  4.   
  5. use Illuminate\Http\Request;  
  6.   
  7. use App\Http\Requests;  
  8. use App\Http\Controllers\Controller;  
  9. use Illuminate\Support\Facades\Input;  
  10. use Auth,Redirect;  
  11. use Validator;  
  12.   
  13. use App\Models\ExampleOrder; //这是我的模型  
  14.   
  15. use EasyWeChat\Foundation\Application;  
  16. use EasyWeChat\Payment\Order;  
  17.   
  18. class WechatController extends Controller  
  19. {  
  20.     protected function options(){ //选项设置  
  21.         return [  
  22.             // 前面的appid什么的也得保留哦  
  23.             'app_id' => 'xxxxxxxxx'//你的APPID  
  24.             'secret'  => 'xxxxxxxxx',     // AppSecret  
  25.             // 'token'   => 'your-token',          // Token  
  26.             // 'aes_key' => '',                    // EncodingAESKey,安全模式下请一定要填写!!!  
  27.             // ...  
  28.             // payment  
  29.             'payment' => [  
  30.                 'merchant_id'        => '你的商户ID,MCH_ID',  
  31.                 'key'                => '你的KEY',  
  32.                 // 'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!  
  33.                 // 'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!  
  34.                 'notify_url'         => '你的回调地址',       // 你也可以在下单时单独设置来想覆盖它  
  35.                 // 'device_info'     => '013467007045764',  
  36.                 // 'sub_app_id'      => '',  
  37.                 // 'sub_merchant_id' => '',  
  38.                 // ...  
  39.             ],  
  40.         ];  
  41.     }  
  42. //传入订单ID即可,我这里是通过订单,来查询该订单的金额,当然你也可以自定义金额  
  43.     public function pay(){  
  44.     $id = Input::get('order_id');//传入订单ID  
  45.     $order_find = ExampleOrder::find($id); //找到该订单  
  46.     $mch_id = xxxxxxx;//你的MCH_ID  
  47.         $options = $this->options();  
  48.         $app = new Application($options);  
  49.         $payment = $app->payment;  
  50.         $out_trade_no = $mch_id.date("YmdHis"); //拼一下订单号  
  51.         $attributes = [  
  52.             'trade_type'       => 'APP'// JSAPI,NATIVE,APP...  
  53.             'body'             => '购买CSDN产品',  
  54.             'detail'           => $order_find->info, //我这里是通过订单找到商品详情,你也可以自定义  
  55.             'out_trade_no'     => $out_trade_no,  
  56.             'total_fee'        => $order_find->money*100, //因为是以分为单位,所以订单里面的金额乘以100  
  57.             // 'notify_url'       => 'http://xxx.com/order-notify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址  
  58.             // 'openid'           => '当前用户的 openid', // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,  
  59.             // ...  
  60.         ];  
  61.         $order = new Order($attributes);  
  62.         $result = $payment->prepare($order);  
  63.     if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){  
  64.         $order_find->out_trade_no = $out_trade_no//在这里更新订单的支付ID  
  65.         $order_find->save();  
  66.         // return response()->json(['result'=>$result]);  
  67.             $prepayId = $result->prepay_id;  
  68.             $config = $payment->configForAppPayment($prepayId);          
  69.             return response()->json($config);  
  70.     }  
  71.   
  72.     }  
  73. //下面是回调函数  
  74.     public function paySuccess(){  
  75.         $options = $this->options();  
  76.         $app = new Application($options);  
  77.         $response = $app->payment->handleNotify(function($notify$successful){  
  78.             // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单  
  79.             $order = ExampleOrder::where('out_trade_no',$notify->out_trade_no)->first();  
  80.             if (count($order) == 0) { // 如果订单不存在  
  81.                 return 'Order not exist.'// 告诉微信,我已经处理完了,订单没找到,别再通知我了  
  82.             }  
  83.             // 如果订单存在  
  84.             // 检查订单是否已经更新过支付状态  
  85.             if ($order->pay_time) { // 假设订单字段“支付时间”不为空代表已经支付  
  86.                 return true; // 已经支付成功了就不再更新了  
  87.             }  
  88.             // 用户是否支付成功  
  89.             if ($successful) {  
  90.                 // 不是已经支付状态则修改为已经支付状态  
  91.                 $order->pay_time = time(); // 更新支付时间为当前时间  
  92.                 $order->status = 6; //支付成功,  
  93.             } else { // 用户支付失败  
  94.                 $order->status = 2; //待付款  
  95.             }  
  96.             $order->save(); // 保存订单  
  97.             return true; // 返回处理完成  
  98.         });  
  99.     }  
  100.   
  101.   
  102.       
  103. }  



大功告成,是不是很EASY呀~得意