记着,这个东西要多打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;
}

您或许感兴趣

[2018-08-20]egg 生产环境下日志文件输出两份问题
[2018-07-01]Redis-Cluster集群的理解和搭建
[2018-09-04]基于laravel队列+Redis的秒杀锁库存实现
[2018-09-14]egg 获取multipart/formdata文件流并再重新包装发送

发表评论

电子邮件地址不会被公开。