- composer下载thinkphp5 composer create-project topthink/think [你的目录名] --prefer-dist
- composer下载easywechat composer require hooklife/thinkphp5-wechat
- 配置好小程序的appid和appsercret,还有证书
第一步:
小程序代码
//app.js App({ onLaunch: function() { wx.login({ success: function (res) { if (res.code) { //发起网络请求获得openid wx.request({ url: 'https://xxxxxxxx/index/on_login/index', data: { code: res.code }, success:function(res){ //console.log(res.data.openid) that.globalData.openId = res.data.openid }, fail:function(e){ console.log(e); } }) } else { console.log('获取用户登录态失败!' + res.errMsg) } } }); } })
php 代码
public function index(){ $code = input('code'); $appid = 'xxx'; $appsecret = 'xxxx'; //初始化 $ch = curl_init(); //设置选项,包括URL curl_setopt($ch, CURLOPT_URL, "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$appsecret}&js_code={$code}&grant_type=authorization_code"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); //执行并获取HTML文档内容 $output = curl_exec($ch); //释放curl句柄 curl_close($ch); //打印获得的数据 return $output; }
第二步:
小程序代码
payMent:function(e){ var that = this; wx.request({ url: 'https://xxx/index/index/index.html', data:{ 'openid': app.globalData.openId, 'total_money':1 }, success:function(res){ wx.requestPayment({ 'timeStamp': res.data.timeStamp+'', 'nonceStr': res.data.nonceStr, 'package': res.data.package, 'signType': 'MD5', 'paySign': res.data.paySign, 'success': function (ref) { console.log(ref); wx.showToast({ title: '支付成功', icon: 'success', duration: 2000 }) }, 'fail': function (ref) { console.log(ref); wx.showToast({ title: '支付失败', icon: 'fail', duration: 2000 }) } }) } }) },php代码
public function index() { $app = Wechat::app(); $payment = $app->payment; $openid = input('openid'); $total_money = input('total_money/d'); $attributes = [ 'trade_type' => 'JSAPI', // JSAPI,NATIVE,APP... 'body' => 'iPad mini 16G 白色', 'detail' => 'iPad mini 16G 白色', 'out_trade_no' => time() . rand(1000, 9999), 'total_fee' => $total_money, // 单位:分 'notify_url' => 'https://xxx/index/index/order_notify.html', // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'openid' => $openid, // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识, ]; $order = new Order($attributes); $result = $payment->prepare($order); $config = array(); if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){ $prepayId = $result->prepay_id; $config = $payment->configForJSSDKPayment($prepayId); } $arr = array( 'timeStamp'=>$config['timestamp'], 'nonceStr'=>$config['nonceStr'], 'package'=>$config['package'], 'signType'=>'MD5', 'paySign'=>$config['paySign'], ); return json_encode($arr); } public function order_notify(){ $app = Wechat::app(); $response = $app->payment->handleNotify(function($notify, $successful){ // 你的逻辑 return true; // 或者错误消息 }); $response->send(); }
总结:花了我一下午的时间来做支付,总的来说,逻辑很简单,就是各种配置很麻烦