
五分钟使用EasyWechat
记着,这个东西要多打Log
配置使用laravel的composer引入吧
composer require "overtrue/laravel-wechat:~4.0"
php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"
然后会生成一份config文件wechat.php
配置一下,在env中与这里的参数一一对应。小程序要使用客服消息要配置token与aes_key参数
/* * 小程序 */ 'mini_program' => [ 'default' => [ 'app_id' => env('WECHAT_MINI_PROGRAM_APPID', ''), 'secret' => env('WECHAT_MINI_PROGRAM_SECRET', ''), 'token' => env('WECHAT_MINI_PROGRAM_TOKEN', ''), 'aes_key' => env('WECHAT_MINI_PROGRAM_AES_KEY', ''), ], ], /* * 微信支付 */ 'payment' => [ 'default' => [ 'app_id' => env('WECHAT_PAYMENT_APPID', ''), 'mch_id' => env('WECHAT_PAYMENT_MCH_ID', 'your-mch-id'), 'key' => env('WECHAT_PAYMENT_KEY', 'key-for-signature'), ], ],
1. 微信支付,上面配置好了后,直接使用applicatio获取app实例
$app = app('wechat.payment'); //除此之外,还需要一些额外的配置,填写一下必要的字段,回调地址之类的 $config = [ 'trade_type' => isset($params['trade_type']) ? $params['trade_type'] : 'APP', 'body' => isset($params['body']) ? $params['body'] : '', 'total_fee' => isset($params['total_fee']) ? $params['total_fee'] : '',//分为单位 'out_trade_no' => config('wechat.payment.default.mch_id') . date('YmdHis'), 'notify_url' => isset($params['notify_url']) ? $params['notify_url'] : '', ]; //如果是JSAPI的话还需要添加openid字段 if (isset($params['trade_type']) && $params['trade_type'] === 'JSAPI') { $config['openid'] = $params['openid']; } //下单 $result = $app->order->unify($config); $wcPayParams = [ "appId" => config('wechat.payment.default.app_id'), "timeStamp" => time(), "nonceStr" => $result['nonce_str'], "package" => "prepay_id=" . $result['prepay_id'], "signType" => "MD5", ]; //这里的话就是要按照键名字典排序,然后再MD5签名就可以了 $paySign = $this->makeSign($wcPayParams, config('wechat.payment.default.key')); $wcPayParams['paySign'] = $paySign; //留着商品号,用于查找自己的订单 $wcPayParams['out_trade_no'] = $config['out_trade_no'];
1.1回调地址
//回调中也是第一件事就是实例化 $app = app('wechat.payment'); handlePaidNotify就是app内置的处理xml的方法 $response = $app->handlePaidNotify(function ($notify, $successful) { // 然后$notify就是回调的data // $successful就是是不是支付成功 //然后就按自己业务逻辑走就行了 }
2. 发送模板消息
条件有两个
1. 模板id自己在微信公共号平台中选,然后记录模板id
2. form_id,这里获取的途径有两个,一个是支付成功后返回的prepay_id,上面那里可以用redis存在,然后使用就成了。第二个途径是前端每次提交都携带form_id,然后后台记录,一直收集,过期时间是7天。
然后都可以了之后调用 app->template_message->send方法,需要用户的openid,这里后台之前登录就应该记录目标用户的openid,然后填入模板id,还有form_id然后page是点击模板消息后跳转的url,这里是自己小程序上的页面,让前端告诉后端就可以了。然后data数组中,keyword1就是对应微信公共号平台中数据出现的位置,你选择完模板消息后就能看到了。
$response = $this->app->template_message->send([ 'touser' => $openid, 'template_id' => 'qufzT0AC23343EQsvM0cvgWSMkJZ3IaC7VOU9s', 'form_id' => $form_id, 'page' => "pages/right-detail/main?activeid={$params['activity_id']} &payid={$params['pay_id']}&isget={$params['is_get']}", 'data' => [ 'keyword1' => $params['location'], 'keyword2' => $params['time'], 'keyword3' => $params['txt'], ] ]); Log::debug($response); //最后使用return $response 返回xml格式给微信 return $response;
3. 发送客服消息
这里比较恶心 $app = $wechat->getApp(); // 获取service实例 $service = $app->customer_service; $app->server->;push(function ($message) use ($service, $customPageService) { // message就是转换成数组的用户数据 if ($message) { $openid = $message['FromUserName']; $type = $message['MsgType']; //消息类型 $Content = $message['Content'];// 用户发送的内容 //根据自己业务该干嘛干嘛 // 图文链接,这里有点恶心,EW的官方文档的news对象不符合微信要求的消息类型,只好自己封装了 $link = new Raw('{ "touser":"' . $openid . '", "msgtype":"link", "link": { "title":"' . $data->reply_title . '", "description":"' . $data->reply_intro . '", "url":"' . $data->reply_link . '", "thumb_url":"' . $data->reply_img . '" } }'); // 发送消息,然后看一下要发图片还是视频或者音频之类的,该上传临时file 的就上传 $result = $service->message($link)->to($openid)->send(); } $response = $app->server->serve(); return $response; }