NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
## 公众号开发配置 ### 网页授权登录 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)