详解用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 相关文章推荐
js 通用javascript函数库整理
Aug 14 Javascript
jquery.tmpl JQuery模板插件
Oct 10 Javascript
解决Extjs上传图片无法预览的解决方法
Mar 22 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
Jun 15 Javascript
推荐10 个很棒的 jQuery 特效代码
Oct 04 Javascript
xmlplus组件设计系列之选项卡(Tabbar)(5)
May 03 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
Aug 22 Javascript
express express-session的使用小结
Dec 12 Javascript
node实现爬虫的几种简易方式
Aug 22 Javascript
vue实现购物车案例
May 30 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 29 Javascript
VUE前端从后台请求过来的数据进行转换数据结构操作
Nov 11 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
多重?l件?合查?(二)
2006/10/09 PHP
PHP操作文件方法问答
2007/03/16 PHP
PHP中获取变量的变量名的一段代码的bug分析
2011/07/07 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
javascript实现类似超链接的效果
2014/12/26 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
jquery使用animate方法实现控制元素移动
2015/03/27 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
AngularJS 2.0新特性有哪些
2016/02/18 Javascript
利用jQuery对无序列表排序的简单方法
2016/10/16 Javascript
jQuery实现表格奇偶行显示不同背景色 就这么简单
2017/03/13 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
基于JSONP原理解析(推荐)
2017/12/04 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
vue.js添加一些触摸事件以及安装fastclick的实例
2018/08/28 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
微信小程序Flex布局用法深入浅出分析
2019/04/25 Javascript
uni-app实现获取验证码倒计时功能
2020/11/01 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
vue 递归组件的简单使用示例
2021/01/14 Vue.js
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python输出带颜色字体实例方法
2019/09/01 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
python实现简单井字棋小游戏
2020/03/05 Python
python支持多继承吗
2020/06/19 Python
python实现录制全屏和选择区域录屏功能
2021/02/05 Python
澳大利亚在线奢侈品时尚零售平台:Azura Runway
2021/01/13 全球购物
大专自我鉴定范文
2013/10/23 职场文书
酒店销售主管岗位职责
2014/01/04 职场文书
小学信息技术教学反思
2014/02/10 职场文书
捐助贫困学生倡议书
2014/05/16 职场文书
基于CSS制作创意端午节专属加载特效
2022/06/01 HTML / CSS