详解用vue.js和laravel实现微信支付


Posted in Javascript onJune 23, 2017

注:此项是微信公众号开发,请在往下看之前,先实现网页微信授权登陆功能,具体参看我简书的另一篇文章:https://3water.com/article/117004.htm

1.打开app/config/wechat.php,配置微信支付参数:

/*
   * 微信支付
   */
   'payment' => [
     'merchant_id'    => env('WECHAT_PAYMENT_MERCHANT_ID', 'your-mch-id'),//商家号ID,请将其放在.env文件中
     'key'        => env('WECHAT_PAYMENT_KEY', 'key-for-signature'),//商家支付key,请将其放在.env文件中
     'cert_path'     => env('WECHAT_PAYMENT_CERT_PATH', storage_path('app/public/apiclient_cert.pem')), //微信支付证书apiclient_cert.pem的绝对路径,我放在storage/app/public/下
     'key_path'      => env('WECHAT_PAYMENT_KEY_PATH', storage_path('app/public/apiclient_key.pem')),   //微信支付证书apiclient_key.pem的绝对路径,我放在storage/app/public/下径
     // 'device_info'   => env('WECHAT_PAYMENT_DEVICE_INFO', ''),
     // 'sub_app_id'   => env('WECHAT_PAYMENT_SUB_APP_ID', ''),
     // 'sub_merchant_id' => env('WECHAT_PAYMENT_SUB_MERCHANT_ID', ''),
     // ...
   ],

以上参数,请依照自己的情况配置,请勿直接拷贝代码!

2.配置微信支付和回调路由

//以下路由我放在api.php路由里,如果你放在web.php路由,请自行调整!
Route::middleware('api')->post('wxpay','BillsController@wxpay');
Route::middleware('api')->post('wx_notify','BillsController@wxnotify');

3.在相应的控制器里创建wxpay的方法

/**
  * 这是我自己项目的内部代码示例,具体根据自己的业务逻辑调整,切不可直接拷贝!
  */
  public function wxpay(Request $request)
  {
    //本实例传递的参数为user_id 和 broadcast_id,具体
    if($request->has('user_id') && $request->has('broadcast_id')){
      $out_trade_no = md5(Carbon::now().str_random(8));
      $user_id = $request->get('user_id');
      $broadcast_id = $request->get('broadcast_id');
      $num = $request->get('num');
      $flag = $request->get('flag');

      $openid = $this->user->getOpenid($user_id);
      $broadcast = $this->broadcast->getById($broadcast_id);
      $speaker_id = $broadcast->speaker_id;
      $body = $broadcast->title;
      $detail = '';
      $paid_at = null;

      $status = 'pre_paid';
      $amount = ($broadcast->price)*$num;

      $attributes = [
        'trade_type'    => 'JSAPI', // JSAPI,NATIVE,APP...
        'body'       => $body, 
        'detail'      => $detail,
        'out_trade_no'   => $out_trade_no,
        'total_fee'    => $amount, // 单位:分
        'notify_url'    => $_ENV['APP_URL'].'/api/wx_notify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
        'openid'      => $openid, // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
        // ...
      ];

      $order = new Order($attributes);
      $result = $this->wechat->payment->prepare($order);
      if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
        //创建预订单
        $param = [
          'out_trade_no'=>$out_trade_no,
          'user_id'=>$user_id,
          'broadcast_id'=>$broadcast_id,
          'speaker_id'=>$speaker_id,
          'body'=>$body,
          'detail'=>$detail,
          'paid_at'=>$paid_at,
          'amount'=>$amount,
          'flag'=>$flag,
          'status'=>$status,
          'num'=>$num
        ];
        $this->bill->store($param);
        //返回
        $prepayId = $result->prepay_id;
        $config = $this->wechat->payment->configForPayment($prepayId,false);

        return response()->json($config);
      }
    }

  }

4.在相应的控制器里添加回调wxnotify方法

/**
   * 这是我自己项目的内部代码示例,具体根据自己的业务逻辑调整,切不可直接拷贝!
   */
  public function wxnotify()
  {
    $response = $this->wechat->payment->handleNotify(function($notify, $successful){
      $order = $this->bill->getBillByOrderno($notify->out_trade_no);//查询订单($notify->out_trade_no);
      if (!$order) { // 如果订单不存在
        return 'Order not exist.'; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
      }
      // 如果订单存在
      // 检查订单是否已经更新过支付状态
      if ($order->paid_at) { // 假设订单字段“支付时间”不为空代表已经支付
        return true; // 已经支付成功了就不再更新了
      }
      // 用户是否支付成功
      if ($successful) {
        // 不是已经支付状态则修改为已经支付状态
        $order->paid_at = Carbon::now(); // 更新支付时间为当前时间
        $order->status = 'paid';
      } else { // 用户支付失败
        $order->status = 'paid_fail';
      }
      $order->save(); // 保存订单
      return true; // 返回处理完成
    });
    return $response; 
  }

5.vue.js中methods的方法代码参考

wechatpay(){
    var param = {
     'user_id':this.getStorage(),
     'broadcast_id':this.id,
     'num':1,
     'flag':'buy',
    }
    this.$http.post(this.GLOBAL.apiUrl+'/wxpay',param).then((response) => {
     WeixinJSBridge.invoke(
      'getBrandWCPayRequest', response.data,
      function(res){
       if(res.err_msg == "get_brand_wcpay_request:ok" ) {
        # 回调成功后跳转
        # router.push({name: 'Room',params:{id:this.id}});
       }
      }
     );
    })
   },

6.微信公众平台配置

1) 在“公众账号设置”—“JS接口安全域名”设置中填写前端域名

2) 在“微信支付”—“开发配置”页面中,公众账号支付下填写“支付授权目录”,注意的是,此授权url为前端支付按钮所在页面的url

7.接下来你就可以测试了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个javascript参数的小问题
Mar 02 Javascript
javascript Array 数组常用方法
Apr 05 Javascript
AngularJS使用ngMessages进行表单验证
Dec 27 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 Javascript
bootstrap table小案例
Oct 21 Javascript
微信小程序 实战程序简易新闻的制作
Jan 09 Javascript
基于node.js依赖express解析post请求四种数据格式
Feb 13 Javascript
微信网页登录逻辑与实现方法
Apr 29 Javascript
解决在Vue中使用axios用form表单出现的问题
Oct 30 Javascript
vue全屏事件开发详解
Jun 17 Javascript
使用Canvas绘制一个游戏人物属性图
Mar 25 Javascript
JS函数式编程实现XDM一
Jun 16 Javascript
详解用vue.js和laravel实现微信授权登陆
Jun 23 #Javascript
妙用Angularjs实现表格按指定列排序
Jun 23 #Javascript
VUE中v-model和v-for指令详解
Jun 23 #Javascript
JavaScript正则表达式简单实用实例
Jun 23 #Javascript
js中的事件委托或是事件代理使用详解
Jun 23 #Javascript
JS判断非空至少输入两个字符的简单实现方法
Jun 23 #Javascript
详解Vue.js之视图和数据的双向绑定(v-model)
Jun 23 #Javascript
You might like
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
浅谈mysql_query()函数的返回值问题
2016/09/05 PHP
php常用的工具开发整理
2019/09/26 PHP
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
JS和Canvas实现图片的预览压缩和上传功能
2018/03/30 Javascript
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
vuex分模块后,实现获取state的值
2020/07/26 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
动态创建类实例代码
2009/10/07 Python
python去除所有html标签的方法
2015/05/05 Python
Python缩进和冒号详解
2016/06/01 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
Python 记录日志的灵活性和可配置性介绍
2018/02/27 Python
CentOS7下python3.7.0安装教程
2018/07/30 Python
OpenCV+face++实现实时人脸识别解锁功能
2019/08/28 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
CSS3打造百度贴吧的3D翻牌效果示例
2017/01/04 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
打造经典复古风格的品牌:Alice + Olivia(爱丽丝+奥利维亚)
2016/09/07 全球购物
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
施工班组长岗位职责
2014/01/05 职场文书
2014自荐信的写作技巧
2014/01/28 职场文书
《风筝》教学反思
2014/04/10 职场文书
车辆转让协议书
2014/09/24 职场文书
孟佩杰观后感
2015/06/17 职场文书
2015年信息化建设工作总结
2015/07/23 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
《观察物体》教学反思
2016/02/17 职场文书
css3实现背景图片半透明内容不透明的方法示例
2021/04/13 HTML / CSS
SQL Server作业失败:无法确定所有者是否有服务器访问权限的解决方法
2021/06/30 SQL Server