PHP微信抢红包神器送礼如何实现

Sina Visitor System小程序与php 实现微信支付
小编分享视频教程窗口wucy03)为好友,获取视频教程,这里的视频教程随时都会变,主要针对初学者,新手们!更多视频教程请查看小编朋友圈
带你入门的vue2.0视频教程与案例开发
链接:http://pan.baidu.com/s/1bpo60r1
文章来自:博客
http://blog.csdn.net/admin1008611/article/details/
很多友友们都会找小程序与微信支付的教程,今天找了一个近期更新的文章给大家参考参考,视频教程呢其实在 “Thinkphp5与小程序商城” 这门课程有详细的讲解到。有这个视频的大家可以仔细认真的看看。以下是文章,截图不明确的可以查看原文链接。
小程序访问地址:
payfee.php:
WeixinPay.php:
小程序页面处理:
回调url:notify.php
以上几步你就可以完成小程序的微信支付与php完美的结合起来
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点PHP学习:使用微信接口实现二维码的生成作者:在线学习平台&www.kokojia.com点击数:84198发布时间: 11:22:50今天给大家带来一个实用比较强的,现在微信的普及度相当的高,而二维码对于渠道的营销推广的用处是非常大,现二维码分为两种:临时二维码、永久二维码,下面就来研究学习一下吧,现在可以通过微信接口实现二维码的生成。
废话不多讲,现在就让我们一起学习,代码如下: & & & ?   /**   * Created by PhpStorm.   * User: bin   * Date: 15-1-16   * Time: 上午9:48   */   namespace HomeC   // 微信处理类   set_time_limit(30);   class Weixin{   //构造方法   static $qrcode_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?";   static $token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&";   static $qrcode_get_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?";   //生成二维码   public function getEwm($wechatid,$fqid,$type = 1){   $wechat = M('Member_public')-&where(array('id'=& $wechatid))-&find();   $appid = $wechat['appid'];   $secret = $wechat['secret'];   $ACCESS_TOKEN = $this-&getToken($appid,$secret);   $url = $this-&getQrcodeurl($ACCESS_TOKEN,$fqid,1);   return DownLoadQr($url,time());   }   protected function getQrcodeurl($ACCESS_TOKEN,$fqid,$type = 1){   $url = self::$qrcode_url.'access_token='.$ACCESS_TOKEN;   if($type == 1){   //生成永久二维码   $qrcode= '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": '.$fqid.'}}}';   }else{   //生成临时二维码   $qrcode = '{"expire_seconds": 1800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": '.$fqid.'}}}';   }   $result = $this-&http_post_data($url,$qrcode);   $oo = json_decode($result[1]);   if(!$oo-&ticket){   $this-&ErrorLogger('getQrcodeurl falied. Error Info: getQrcodeurl get failed');   exit();   }   $url = self::$qrcode_get_url.'ticket='.$oo-&ticket.'';   return $   }   protected function getToken($appid,$secret){   $ACCESS_TOKEN = file_get_contents(self::$token_url."appid=$appid&secret=$secret");   $ACCESS_TOKEN = json_decode($ACCESS_TOKEN);   $ACCESS_TOKEN = $ACCESS_TOKEN-&access_   return $ACCESS_TOKEN;   }   protected function http_post_data($url, $data_string) {   $ch = curl_init();   curl_setopt($ch, CURLOPT_POST, 1);   curl_setopt($ch, CURLOPT_URL, $url);   curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);   curl_setopt($ch, CURLOPT_HTTPHEADER, array(   'Content-Type: application/ charset=utf-8',   'Content-Length: ' . strlen($data_string))   );   ob_start();   curl_exec($ch);   if (curl_errno($ch)) {   $this-&ErrorLogger('curl falied. Error Info: '.curl_error($ch));   }   $return_content = ob_get_contents();   ob_end_clean();   $return_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);   return array($return_code, $return_content);   }   //下载二维码到服务器   protected function DownLoadQr($url,$filestring){   if($url == ""){      }   $filename = $filestring.'.jpg';   ob_start();   readfile($url);   $img=ob_get_contents();   ob_end_clean();   $size=strlen($img);   $fp2=fopen('./Uploads/qrcode/'.$filename,"a");   if(fwrite($fp2,$img) === false){   $this-&ErrorLogger('dolwload image falied. Error Info: 无法写入图片');   exit();   }   fclose($fp2);   return './Uploads/qrcode/'.$   }   private function ErrorLogger($errMsg){   $logger = fopen('./ErrorLog.txt', 'a+');   fwrite($logger, date('Y-m-d H:i:s')." Error Info : ".$errMsg."rn");   }   }
好了,以上就是这次中关于PHP微信开发之使用微信接口实现二维码生成的,如需学习更多PHP开发相关的视频课程可以登录课课家。标签:赞(20)踩(20)分享到:上一篇:下一篇:最新教程热门教程评论()您需要登录后才可以评论请[][]最新评论平面设计是计算机应用中最重要的一项,而它又涉及到了软件应用的方方面面.网页制作,三维设计等都会与平面设计相关.有了它,才使得我们的视界变的更加丰富与绚丽[0]编程语言为你推荐推荐查看热门资讯热门图书写这篇文章的目的主要是由于在微信公众平台提供的SDK中并没有提供此功能的SDK实现,
其实最后实现还是借助&&和 。
的应用场景: 公众号向已关注用户付款,比如处理退款、财务结算等
先说一下实现思路:
在SDK中自带类库的基础上扩展WxMchPay组件, 实现企业付款功能的扩展。
话不多说,上代码, 下面是继承SDK,实现企业付款的组件:
$parameters参数参考:
// 引入SDK
import('Common.Util.WxPay');
* 微信企业付款操作类
* DateTime: &15/9/16 11:00&
class WxMchPay extends Wxpay_client_pub
* API 参数
* @var array
* 'mch_appid'
# 公众号APPID
* 'device_info'
* 'nonce_str'
# 随机字符串
* 'partner_trade_no'
# 商户订单号
* 'openid'
# 收款用户openid
* 'check_name'
# 校验用户姓名选项 针对实名认证的用户
* 're_user_name'
# 收款用户姓名
* 'amount'
# 付款金额
# 企业付款描述信息
* 'spbill_create_ip'
public $parameters = [];
public function __construct()
$this-&url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
$this-&curl_timeout = WxPayConf_pub::CURL_TIMEOUT;
* 生成请求xml数据
* @return string
public function createXml()
$this-&parameters['mch_appid'] = WxPayConf_pub::APPID;
$this-&parameters['mchid']
= WxPayConf_pub::MCHID;
$this-&parameters['nonce_str'] = $this-&createNoncestr();
$this-&parameters['sign']
= $this-&getSign($this-&parameters);
return $this-&arrayToXml($this-&parameters);
作用:使用证书,以post方式提交xml到对应的接口url
function postXmlSSLCurl($xml,$url,$second=30)
$ch = curl_init();
//超时时间
curl_setopt($ch,CURLOPT_TIMEOUT,$second);
//这里设置代理,如果有的话
//curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');
//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);
//设置header
curl_setopt($ch,CURLOPT_HEADER,FALSE);
//要求结果为字符串且输出到屏幕上
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
//设置证书
curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH);
//使用证书:cert 与 key 分别属于两个.pem文件
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLCERT, WxPayConf_pub::SSLCERT_PATH);
//默认格式为PEM,可以注释
curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');
curl_setopt($ch,CURLOPT_SSLKEY, WxPayConf_pub::SSLKEY_PATH);
//post提交方式
curl_setopt($ch,CURLOPT_POST, true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$xml);
$data = curl_exec($ch);
//返回结果
if($data){
curl_close($ch);
return $data;
$error = curl_errno($ch);
echo "curl出错,错误码:$error"."&br&";
echo "&a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'&错误原因查询&/a&&/br&";
curl_close($ch);
return false;
Controller层功能实现:
* DateTime: &15/9/20 16:47&
namespace Home\C
class TestController extends CommonController
* 企业付款测试
public function rebate()
import('Common.Util.WxMchPay');
$mchPay = new \WxMchPay();
// 用户openid
$mchPay-&setParameter('openid', 'oy2lbszXkgvlEKThrzqEziKEBzqU');
// 商户订单号
$mchPay-&setParameter('partner_trade_no', 'test-'.time());
// 校验用户姓名选项
$mchPay-&setParameter('check_name', 'NO_CHECK');
// 企业付款金额
$mchPay-&setParameter('amount', 100);
// 企业付款描述信息
$mchPay-&setParameter('desc', '开发测试');
// 调用接口的机器IP地址
$mchPay-&setParameter('spbill_create_ip', '127.0.0.1'); # getClientIp()
// 收款用户姓名
// $mchPay-&setParameter('re_user_name', 'Max wen');
// 设备信息
// $mchPay-&setParameter('device_info', 'dev_server');
$response = $mchPay-&postXmlSSL();
if( !empty($response) ) {
$data = simplexml_load_string($response, null, LIBXML_NOCDATA);
echo json_encode($data);
echo json_encode( array('return_code' =& 'FAIL', 'return_msg' =& 'transfers_接口出错', 'return_ext' =& array()) );
完成上述两部分代码,基本就可以成功调用企业付款API了。
返回结果的数据结构示例:
"return_code": "SUCCESS",
"return_msg": { },
"mch_appid": "wx519caeb",
"mchid": "",
"device_info": { },
"nonce_str": "qjupk84q4iqxkb578hb5h2qiatgcwxwg",
"result_code": "SUCCESS",
"partner_trade_no": "test-",
"payment_no": "0397",
"payment_time": " 10:19:26"
可能遇到的问题:
1、CA证书错误
  在WxMchPay中大家可以看到,我重写了SDK中&Wxpay_client_pub 的&postXmlSSLCurl()方法
  因为默认在SDK中的这个方法在CURL POST请求的时候没有附带CA证书。
  相比之下就多了&
  curl_setopt($ch,CURLOPT_CAINFO, WxPayConf_pub::SSLROOTCA_PATH);  这么一行代码。  
  作用就是请求时附带CA证书。
2、对同一用户转账操作过于频繁,请稍候重试.
  这个错误属于微信服务端的限制,具体限制频率也没有找到那里有说明,不过经过实际测试大概在1分钟左右。
  所以在开发的时候还需要多注意。
有任何疑问欢迎共同探讨。P.S. 搬家至博客园的第一篇随笔, 送给组织的见面礼。希望再次广交猿友。
阅读(...) 评论()手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP)
时间: 12:00:34
&&&& 阅读:2745
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&wechat
手把手实现微信网页授权和微信支付,附源代码(VUE and thinkPHP)
公众号开发是痛苦的,痛苦在好多问题开发者文档是没有提到的,是需要你猜的. 在开发过程中翻了好多的文档,都是说明其中的一部分问题的,很费时间,所以在此总结大体过程。我们模拟的是一个支付的商城,在实现购买过程中基本是把微信公众号最主要模块实现了,其余的功能我们没有涉及,但应该是触类旁通的。
我们叙述的过程是按开发流程进行叙述的,不会是按照开发文档的形式叙述,希望您能结合一起阅读,当然在流程中我们会提醒你阅读的部分
[解决的问题]
[前端技术栈]
[后端技术栈]
[基本说明]
[开发过程]
[1.基本配置]
[2.网页授权]
[签名后台]
[签名前台]
[微信支付]
解决的问题
[x] 微信网页授权
[x] 公众号支付
[x] 公众号分享
[x] 公众号扫一扫
[x] 微信后台获取webapp(spa-vue)路由,导致 invalid 问题
[x] 前端history.pushState()导致ios失效问题
[x] 换取微信openID 顺序问题
[x] 网页授权后强制登录官网账户,全局进行拦截
前端技术栈
vue2 + vuex + vue-router + webpack + ES6/7 + axios + sass + flex
后端技术栈
thinkPHP3.2 + mysql + 阿里云Linux Ubuntu
开发环境 macOS 10.13.3 &nodejs 8.0.0 centOS 7.4
本文中使用的url是m.example.com (demo), 开发过程中需要替换成你的URL。
如有问题请直接在 Issues 中提,或者您发现问题并有非常好的解决方案,欢迎 PR
本着线上线下一样的原则,最好申请两个认证微信公众号,一个是发布使用,一个是本地开发使用。微信自带提供的微信测试功能也不太好用
可以添加群交流
请阅读以下微信开发者文档
附:参数说明
appid:公众号唯一标识id(公众号-开发-基本配置中查看)。
secret:公众号开发密钥(初次请保存本地,忘记请重置)。
openid: 每个微信用户关注此公众号后会生成openid,并且在此公众号中每个用户得openid是唯一的。
code : code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
IP 白名单:允许访问微信服务器的ip(linux 公网ip 注意如果服务器有CDN加速,CDN请添加白名单)
1.基本配置
此部分对应文档的
一个已经认证的公众号(就是你已经交300元)
已经备案的域名
域名解析到服务器 传送门
: 微信开发可定使用这个工具。必须把前端代码放到》服务器上》用这个工具调试。请仔细阅读
设置web开发者工具
在开发-开发者工具-web开发者工具设置开发者账号
设置IP 白名单
在设置-安全中心-IP白名单设置你服务器的IP,通过开发者ID及密码调用获取access_token接口时,需要设置访问来源IP为白名单。
设置基本配置-开发者ID
设置开发者密码(AppSecret)
我们获取到的AppSecret (eg) a66b1cde47aaaaaaa
设置服务器基本配置
这部的目的是为了和微信服务器建立联系, 通过微信平台实现我们的业务逻辑。
![image](//upload-images.jianshu.io/upload_images/d4e2f74ea3da4b?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
3、依据接口文档实现业务逻辑
下面详细介绍这3个步骤。
**第一步:填写服务器配置**
* 登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮、。
* 填写服务器地址(URL)、Token和EncodingAESKey
* URL是开发者用来接收微信消息和事件的接口URL。
* Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
* EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
* 同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效
* 加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码
第二步:验证消息的确来自微信服务器
现在如果你点击确认 按钮,肯定会报认证错误。因为我们没有做微信认证请求 接收。 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
将token、timestamp、nonce三个参数进行字典序排序
将三个参数字符串拼接成一个字符串进行sha1加密
开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
微信官方提供在文档中提供了PHP原生示例
Thinkphp 3.2 验证示例
namespace Home\Controller;//命名空间注意用自己的
use Think\Controller; //引入Think Controller
* Class IndexController
* @package Home\Controller
* @name 微信服务器验证类
* @author weikai
class IndexController extends Controller {
//微信服务器接入
public function index()
//这个echostr呢
只有说验证的时候才会echo
如果是验证过之后这个echostr是不存在的字段了
if($_GET[‘echostr‘]){
$echoStr = $_GET["echostr"];
if ($this-&checkSignature()) {
ob_clean();//防止之前缓存区数据影响
echo $echoStr;
$this-&responseMsg(); //如果没有echostr,则返回消息
//验证微信开发者模式接入是否成功
private function checkSignature()
//signature 是微信传过来的签名
$signature = $_GET["signature"];
//微信发过来的时间戳
$timestamp = $_GET["timestamp"];
//微信传过来的值随机字符串
= $_GET["nonce"];
//定义你在微信公众号开发者模式里面定义的token 这里举例为weixin
= "weixin";
//三个变量 按照字典排序 形成一个数组
$tmpArr = array(
$timestamp,
// 字典排序
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
//哈希加密
在laravel里面是Hash::
$tmpStr = sha1($tmpStr);
//哈希加密后的数据 和微信服务器传过来的签名比较
if ($tmpStr == $signature) {
return true;
return false;
* @name 消息接收
* @author weikai
public function responseMsg()//执行接收器方法
//获取微信服务器的XML数据 转化为对象 判断消息类型
$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
if (!empty($postStr)){
$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);
$RX_TYPE = trim($postObj-&MsgType);
switch($RX_TYPE){
case "event":
$result = $this-&receiveEvent($postObj);
case "text":
$result = $this-&handleText($postObj);
echo $result;
} //classend
注意:示例代码中 Token 要与微信公众号基本配置中的Token 一致
微信公众号基本配置中点击启用配置,如果验证失败可能是网络延迟导致,再点击启用多试几次,3次以上不成功,请检查代码。
2.网页授权
如果使用支付功能,必须先授权
大家应该经历过,我们在公众号打开页面,一般都会弹出一个按钮需要我们点击同意才会继续浏览页面
但是我们第二次点击的时候是不需要点击授权的,这两个过程是不同的,是两种授权:(样例不可直接使用,是demo)
非静默授权的 URL 样例:(scope=snsapi_userinfo)
请注意加粗部分
点击`允许`即可带着用户信息跳转到第三方页面,如上图.
作用: 是用来获取用户的基本信息的
静默授权的 URL 样例: (scope=snsapi_base)
请注意加粗部分
在微信 web 开发者工具中打开类似的授权页 URL 则会`自动跳转`到第三方页面。
作用:是用来获取进入页面的用户的openid的
注意:俩者授权区别
非静默授权:可获取微信用户基础信息如 用户微信昵称 、城市、语言、头像、关注公众号时间、openid等。
静默授权:用户体验好,用户不知觉间完成授权,但只可以获取到用户得openid。
请注意 关于网页授权access_token和普通access_token的区别 章节
具体而言,网页授权流程分为四步:
注意: 步骤一是由前台完成的,前台获取code 之后需要传给后台,由后台完成 2 3 4
1. 引导用户进入授权页面同意授权后微信跳转回调地址并传递参数code 获取code
2. 通过code换取网页授权access_token(与基础支持中的access_token不同)
3. 如果需要,开发者可以刷新网页授权access_token,避免过期
4. 通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
1、引导用户进入授权页面同意授权,获取code
建议:如果路由由vue管理,建议code由前台获取并发送给后台。 在公众账号中配置授权回调域名
(${redirect_url}看下面)
微信授权是前端发起的,
时机: 是在你需要获取微信信息之前的页面发起请求,当然大部分情况是用户进入webapp 我们就开始授权,我们的dome中就是进入立马授权
前台(Vue): 前台做引导到授权页面,使用location.href 就可以实现。授权过程中会有几次这页面跳转。我们把授权函数放在router.beforeEach((to, from, next)=& {}) 函数中,好控制。
跳转: 我们刚才提到前台需要引导,这个引导路径是需要后台提供,基本的形式是location.href = http://m.example.com/Home/WxSignature/getBaseInfos?redirect_url=${redirect_url}。要注意redirect_url=${redirect_url},${redirect_url} 是告诉后台回调到前台的URL(请encodeURIComponent).
后台(PHP): 前台调到了后台,后台此时需要获取code了。后台要通过 特定的URL(见官网第一步:用户同意授权,获取code)获取code.
api参数解释:
appid : 请查看本文 参数说明
redirect_uri : 回调链接,完成用户授权后微信服务器自动回调得uri,一般为业务首页链接(注意请转义)。
response_type : 固定为code 。
scope : 授权方式 可选静默(snsapi_base) 或者非静默(snsapi_userinfo)
state : 此参数可为业务需求使用,根据业务需要传入。
静默授权方式获取code: https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的appid&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_4_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
非静默授权方式获取code:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
* @name 授权引导后微信会跳转到回调地址并携带code参数
* @author weikai
public function getBaseInfos(){
$redirect_url = I(‘get.redirect_url‘);//获取前台传递的回调地址
$app_id = C(‘WX_APPID‘);//获取自己公众号的 appid
$redirect_uri = urlencode($redirect_url);//处理url
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$app_id."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect";
header(‘location:‘.$url);
错误返回码说明如下:
redirect_uri域名与后台配置不一致
此公众号被封禁
此公众号并没有这些scope的权限
必须关注此测试号
操作太频繁了,请稍后重试
scope不能为空
redirect_uri不能为空
appid不能为空
state不能为空
公众号未授权第三方平台,请检查授权状态
不支持微信开放平台的Appid,请使用公众号Appid
前台获取code
引导用户到授权页面后 微信服务器会根据redirect_uri参数跳转,并且携带code参数和值
前台截取出code 就可以了,传给后台,到这里基本就可以了。但是我们通常是用户每次登陆都需要进行授权,我们判断url中的参数就可以实现了。往往我们也要监听用户是否登录,判断用户是否需要账号密码登录也需要在 router.beforeEach((to, from, next)=& {}) 实现,beforeEach()有些复杂了,请大家阅读具体代码。请结合自己具体的业务书写
* 判断用户是否需要账号密码登录,login页面监听
* @DateTime
let checkIsLoginGotologin = function(to, next) {
// isRelation 判断用户微信账户是否关联官网账户
// routeArr 是一些路由是不需要受监听的
// !res ? 已经授权 :没有授权
isRelation().then(res =& {
if (routeArr.includes(to.path)) {
!res ? next(‘index‘) : next();
// 没有授权且不是授权页
// 当在授权的情况下是不允许访问login页面
(res && to.path !== ‘/login‘) ? next(‘/login‘): ((!res && to.path === ‘/login‘) ? next(‘index‘) : next())
* 获取和推送code
* @DateTime
let getCodePullCode = async function(url) {
let mycode = url.substring(url.indexOf(‘code=‘) + 5, url.indexOf(‘state=‘) - 1);// 前台截取code
selfStore.set(‘wechatCodeStr‘, mycode); // 存储code
//传送给后台code
await axios
.get("/home/WxSignature/getCode", {
code: mycode
.then(res =& {
//需要登录
var res = res.
if (res && res.status === 1) {
selfStore.set(‘openId‘, res.data);//本地存储Openid,也可以不存储。由后台调配
location.href = `http://m.example.com/?a=1#${location.href.split(‘#‘)[1]}`; // 增加a=1 防止支付错误 防止前台死循环
* 全局路由
* @DateTime
if (process.env.NODE_ENV == ‘production‘) {
router.beforeEach((to, from, next) =& {
let url = location.
// 同时判断‘a=1‘ 和code= 防止前台死循环
// wechatCode没有 发起授权
if ((url.indexOf(‘a=1‘) & 1) && (url.indexOf(‘code=‘) & 1)) {
let redirect_url = encodeURIComponent(`http://m.example.com#${to.path}`);
location.href = `http://m.example.com/Home/WxSignature/getBaseInfos?redirect_url=${redirect_url}`;
// 后台重定向页面,授权登录
(!(url.indexOf(‘code=‘) & 1)) ? getCodePullCode(url): checkIsLoginGotologin(to, next)
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
appid : 请查看本文 参数说明
secret : 请查看本文 参数说明
code :获取到得code。
grant_type : 固定为authorization_code
获取code后,请求以下链接获取access_token以及用户得openid:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的appid&secret=你的sercret&code=刚刚获取得code&grant_type=authorization_code
* 前台传递code,后台存储
* @DateTime
[description]
public function getCode() {
$code = I(‘get.code‘);//授权用code
$appid = C(‘WX_APPID‘);//你的公众号appid
$secret = C(‘WX_APPSECRET‘);//你的公众号secret
// 组合获取的url
$url="https://api.weixin.qq.com/sns/oauth2/access_token?
appid=$appid&secret=$secret&code=$code&grant_type=authorization_code";
// curl获取access_token 和openid
$result=$this-&curl_get_contents($url);//curl get请求函数请自行百度
$result=json_decode($result,true);//json转数组
$data[‘openid‘]=$result[‘openid‘];
$data[‘access_token‘] = $result[‘access_token‘];
$data[‘refresh_token‘] = $result[‘refresh_token‘];
if($data){
return $this-&ajaxReturn(show(1,‘获取access_token 和openid‘,$data));//show()方法为自定义封装消息
return $this-&ajaxReturn(show(0,‘没有access_token 和openid‘));
正确时返回的JSON数据包如下:
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
有些数据是需要存储到后台数据库的如openid
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in
access_token接口调用凭证超时时间,单位(秒)
refresh_token
用户刷新access_token
用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
用户授权的作用域,使用逗号(,)分隔
错误时微信会返回JSON数据包如下(示例为Code无效错误):
{"errcode":40029,"errmsg":"invalid code"}
其实完成第二步就完成了基本的网页授权但是还没有获取到用户的信息,授权也没有实际作用了。
3、刷新access_token(如果需要)
由于获取用户信息所用得access_token有效时常比较短,如果想获取access_token后间隔时间较长获取微信用户基本信息请请求刷新access_token api
我这里没有采用授权后拉取用户信息的api,而是采用用户信息获取的api。
获取第二步的refresh_token后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
公众号的唯一标识
grant_type
填写为refresh_token
refresh_token
填写通过access_token获取到的refresh_token参数
* 刷新access_token
* @refresh_token 用与刷新access_token的参数
* @DateTime
[description]
public function reAccessToken($refresh_token) {
$appid = C(‘WX_APPID‘);//你的公众号appid
// 组合获取的url
$url="https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=$appid&grant_type=refresh_token&refresh_token=$refresh_token";
// curl请求刷新access_token
$result=$this-&curl_get_contents($url);//curl get请求函数请自行百度
$result=json_decode($result,true);//json转数组
$data[‘access_token‘] = $result[‘access_token‘];
if($data){
return $this-&ajaxReturn(show(1,‘获取access_token‘ ,$data));//show()方法为自定义封装消息
return $this-&ajaxReturn(show(0,‘没有access_token‘));
正确时返回的JSON数据包如下:
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
和上步返回的数据相同,目的就是刷新了access_token 的有效时间,有效期内可以使用access_token 和openid获取微信用户信息
4、通过网页授权access_token和openid获取用户基本信息
这里微信提供了两个不同的api
1.在微信授权里微信提供拉取用户信息的api(access_token时间限制为五分钟失效)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
access_token
网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
用户的唯一标识
返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
2.微信用户管理提供的获取用户信息api(只需要使用全局access_token有效期2小时,和openid)
推荐使用这个接口获取用户信息
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
access_token
全局access_token 有效期7200秒
用户的唯一标识
返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
如果网页授权参数为snsapi_userinfo(非静默授权),则此时可以通过access_token和openid获取用户信息了。
* @return mixed
* @name 使用全局access_token获取用户详细信息
* @author weikai
public function getWxUserInfo($openid){
$access_token = $this-&getAccess_Token();
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
$data = $this-&cUrl($url);
$data = json_decode($data);
if($data){
return $data;
正确时返回的JSON数据包如下:
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl":
"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2"
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
用户的唯一标识
用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
用户个人资料填写的省份
普通用户个人资料填写的城市
国家,如中国为CN
headimgurl
用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。
错误时微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":" invalid openid "}
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文地址:https://www.cnblogs.com/iSAM2016/p/8685874.html
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 微信转账送礼敢要吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信