## 公众号开发配置
### 网页授权登录
1. 秘钥和服务器配置, 位置: 微信公众号平台->开发->基本配置
2. 网页授权接口权限配置, 位置: 微信公众号平台->开发->接口权限->网页服务->网页授权
### 使用微信JS-SDK
1. 绑定域名, 位置: 微信公众号平台->设置->公众号设置->功能设置->JS接口安全域名
### 公众号支付
1. 公众号开通微信支付功能, 位置: 微信公众号平台->微信支付->开通
2. 配置支付授权目录, 位置: 微信商户平台->开发配置->支付配置
3. 特别注意: 微信支付授权目录必须设置正确, 否则公众号内会出现错误提示: `chooseWXPay:fail, the permission value is offline verifying`, 支付授权目录一般设置为调起JSAPI支付的页面地址的上一级目录
### 白名单设置
1. 使用网页接口调试, 获取access_token, 需要添加ip地址白名单, 位置: 微信公众号平台->开发->基本配置->IP白名单
2. 配置支付授权目录, 位置: 微信商户平台->开发配置->支付配置
3. 特别注意: 微信支付授权目录必须设置正确, 否则公众号内会出现错误提示: `chooseWXPay:fail, the permission value is offline verifying`, 支付授权目录一般设置为调起JSAPI支付的页面地址的上一级目录
## 使用easywechat进行微信开发(thinkphp5为例)
1. 首先使用composer安装对应版本的easywechat
~~~
$ composer require overtrue/wechat:~3.1 -vvv // 适用于PHP >= 5.5.9
$ composer require overtrue/wechat:~4.0 -vvv // 适用于PHP >= 7.0
// 更多环境要求请移步easywechat官方文档
~~~
2. 然后,自定义一个easywechat工具类
~~~
<?php
namespace app\common\model;
use EasyWeChat\Foundation\Application;
use EasyWeChat\Payment\Order;
/**
* Class Easywechat
*
* Created on 18/1/25.
* 备注:easywechat工具类
*/
class Easywechat
{
public $app = "";
public $appUrl = "";
public function __construct()
{
$this->appUrl = request()->root(true);
// 公众号配置信息
$wxConfig = model("WxConfig")->find()->toArray(); // 公众号配置信息,含appid,appsecret,token,encodingaeskey等
$wxPay = model("Payment")->where('type', 'wxpay')->find(); // 公众号支付(商户号)配置信息,含mchid,key
// 初始化SDK,创建一个 EasyWeChat\Foundation\Application 实例
$options = [
'app_id' => $wxConfig['appid'], // AppID
'secret' => $wxConfig['appsecret'], // AppSecret
'token' => $wxConfig['token'], // Token
'aes_key' => $wxConfig['encodingaeskey'], // EncodingAESKey,安全模式下请一定要填写!!!
'payment' => [
'merchant_id' => $wxPay["config"]["mchid"],
'key' => $wxPay["config"]["key"],
'cert_path' => DATA_PATH . DS . 'apiclient_cert.pem', // XXX: 绝对路径!!!!
'key_path' => DATA_PATH . DS . 'apiclient_key.pem', // XXX: 绝对路径!!!!
'notify_url' => $this->appUrl . url("api/pay/wxNotify"), // 也可以在下单时单独设置来想覆盖它
],
];
$this->app = new Application($options);
}
}
~~~
* 公众号支付
~~~
use EasyWeChat\Foundation\Application;
use EasyWeChat\Payment\Order;
...
class PayController
{
// 微信支付
public function wxpay()
{
$ono = input('param.no'); // 公众号商城系统订单号
$ofm = model('Order')->where(['orderid' => $ono])->find(); // 找到订单信息
if ($ofm['pay_status'] != 0) { // 检测订单支付状态
return json(['data' => false, 'msg' => '非法操作', 'code' => 0]);
}
$uid = $ofm['user_id'];
// 获取用户授权openid
$openid = model('OauthWx')->where('user_id', $uid)->value('openid');
if (!$openid) {
return json(['data' => false, 'msg' => '请使用微信登陆', 'code' => 0]);
}
// 得到支付对象payment
$app = model('Easywechat')->app;
$payment = $app->payment;
// 生成商品对象
$product = [
'trade_type' => 'JSAPI', // 微信公众号支付填JSAPI
'body' => $ofm['orderid'],
'detail' => $ofm['orderid'],
'out_trade_no' => $ofm['orderid'], // 这是自己ERP系统里的订单ID,不重复就行。
'total_fee' => $ofm['totalprice'] * 100, // 金额,这里的8888分人民币。单位只能是分。
'openid' => $openid, // 这个不能少,少了要报错。
];
$order = new Order($product);
// 预处理,得到一个预处理id
$prepayId = null;
$result = $payment->prepare($order);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS') {
$prepayId = $result->prepay_id; // 这个很重要。有了这个才能调用支付。
} else {
// 出错就说出来,不然还能怎样?
return json(['data' => $result, 'msg' => '支付出错了', 'code' => 0]);
}
// 生成支付JS配置
$json = $payment->configForPayment($prepayId);
return json(['data' => $json, 'msg' => '支付JS配置', 'code' => 1]);
}
/**
* 公众号支付成功之后的回调地址
*/
public function wxNotify()
{
$app = model('Easywechat')->app;
$payment = $app->payment;
$response = $payment->handleNotify(function ($notify, $successful) {
// 用户是否支付成功
if ($successful) {
$out_trade_no = $notify['out_trade_no'];
$total_fee = $notify['total_fee'];
$openid = $notify['openid'];
$didPayTrue = model("Trade")->where(['tradeid' => $out_trade_no])->find();
if (!$didPayTrue) {
$afterpay = $this->payTrue($out_trade_no, $total_fee / 100, "微信支付");
return json(['data' => $afterpay, 'msg' => 'pay_success', 'code' => 1]);
}
} else {
// 用户支付失败
return json(['data' => false, 'msg' => 'pay_fail', 'code' => 1]);
}
});
}
...
~~~
* 微信分享
~~~
// 第一步, 通过接口获取微信JSSDK配置信息
public function getJssdkConfig()
{
$conf = null;
$app = model('Easywechat')->app;
$js = $app->js;
$url = input('post.url');
$js->setUrl($url);
$conf = $js->config(['onMenuShareAppMessage', 'onMenuShareTimeline'], false, false, false);
return json([
'data' => $conf,
'msg' => 'JSSDK配置信息',
'code' => 1,
]);
}
// 第二步, 在需要调用JS接口的页面引入JS文件
<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js" type="text/javascript" charset="utf-8"></script>
~~~
注: 具体用户行为相关操作请参照[微信JS-SDK说明文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)
- JavaScript笔记
- JQuery
- Echarts初级入门
- Js常用正则表达式
- 使用vuejs前端框架
- Bootbox.js官方文档中文版
- LocalStorage基本用法小结
- Toastr消息提示插件中文文档
- Ajax提交Form数据及文件上传
- Nodejs笔记
- Python笔记
- Scrapy爬虫技术
- Django框架
- Java笔记
- 环境搭建
- Php笔记
- MacOS 10.13.6搭建PHP开发环境
- Php常见问题及解决方法
- 玩转laravel之homestead
- Apache服务器的基本操作
- 如何使用CentOS7 + Lnmp
- ThinkPHP爬坑之路
- 初识Swoole
- 小贴士
- 习题集
- 方法集
- 数据库
- mysql
- 常用的SQL语句
- 日常操作和设置
- 常见问题及解决办法
- 读写分离和主从复制
- 数据表分区
- postgresql
- 在PHP中的应用
- redis
- 测试
- 接口测试
- Web测试
- 杂项
- Sublime text3使用小贴士
- 利用虚拟机学习Linux
- PHPstorm常用设置
- Windows实用tips
- 微信开发小知识
- Git常用操作
- Swift入门
- 机器学习
- 系统命令
- 网络拾贝
