2018-09-12 22:05:40 weixin_41031687 阅读数 318
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27856 人正在学习 去看看 秦子恒

设置好微信公众平台与服务器信息以后就可以获取用户对公众号的操作信息直接上PHP代码:

             $postStr = @$GLOBALS["HTTP_RAW_POST_DATA"];            
              // 获取用户信息
              $postObj = @simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
              @$fromUsername = $postObj->FromUserName;//谁发的(用户openid)
              @$toUsername = $postObj->ToUserName; //发送给谁(公众号id)
              @$createtime = $postObj->CreateTime; //发送时间
                //首次关注定义变量
                $type = $postObj->MsgType;
                $cus = $postObj->Event;
                $EventKey = trim((string)$postObj->EventKey);
                $keyArray = explode("_", $EventKey);
               @$content = $postObj->Content; //获取用户发送文本   

          if($type=="event" and $cus=="subscribe"){//判断用户首次关注事件

                     //写自己需要执行的程序。  

              }else if($type=="event" and $cus=="unsubscribe"){//判断用户取消关注事件   

                     //写自己需要执行的程序。    

              }
2018-11-29 18:18:43 qq_37788558 阅读数 1388
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27856 人正在学习 去看看 秦子恒

记一次小需求:
一个投票活动,在原有的投票接口里(很老的项目。。)增加判断用户是否在微信内登陆,且是否关注公众号,如果用户未关注,则引导用户关注公众号。

一、需求要点

  • 只对指定对部分活动有效
  • 区分微信浏览器访问和外部浏览器访问
  • 区分用户是否关注我们的公众号
  • 关注可投,不关注引导关注

二、大体实现

  1. 指定部分活动有效
    最简单对方式,设置一个数组,对id在数组内的逻辑活动才执行新增的逻辑,这样主流程里只插入几行代码,整个逻辑在另一个函数内实现。
...前置逻辑
$wechatAuthList = [];
if (in_array($article_id, $wechatAuthList)){
    if($this->wechatAuth()){
        return ['code' => 403, 'message' => '引导关注']
    }
}
...后面的逻辑
  1. 区分微信浏览器访问和外部浏览器访问
    通过user-agent判断,没什么好说了。
	// 判断是否是微信浏览器
    public function isWeixin()
    {
        if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {
            return true;
        }
        return false;
    }
  1. 区分用户是否关注我们的公众号
    通过微信授权接口,获取用户信息,通过返回结果的 subscribe 字段判断。

    ‘subscribe’ = 1 (已关注)
    ‘subscribe’ = 0 (未关注)

这一步我们要依次用到四个接口:

//获取code
"https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appId}&redirect_uri=$redirect&response_type=code&scope={$scope}&state=1#wechat_redirec";
//获取opendId
"https://api.weixin.qq.com/sns/oauth2/access_token?appid={$this->appId}&secret={$this->secret}&code={$code}&grant_type=authorization_code";
//获取access_token(基础token)
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appId}&secret={$this->secret}";
//获取用户信息
"https://api.weixin.qq.com/cgi-bin/user/info?access_token={$this->accessToken}&openid={$this->openId}&lang=zh_CN"

下文会描述具体步骤。

  1. 关注可投,不关注引导关注
    基本是前端工作了,对后端来说就是根据不同情况返回不同结果,前端根据返回值确定是否弹出浮层显示二维码。
    伪代码:
 $.ajax({
        type: '...',
        url: '...',
        data: '...',
        success: function(data) {
        	if (data.code === 403){
        		$("#tab").alert();
        	}
        }

三、详细步骤

下面来说下第3部分,如何区分用户是否关注我们的公众号

首先明确需要用到哪些:

  • 上边列出的四个接口
  • 公众号 appId 和 secret
  • 微信公众平台设置授权回调地址和redirect_uri 一致

需要注意的:

  • 别忘了到微信公众平台设置授权回调地址和redirect_uri 一致,不然会报 redirect_uri参数错误
  • 重定向地址redirect_uri,如果有参数的话,别忘了urlencode(),不然微信重定向回来原本的参数会没有
  • 获取code时需要在浏览器重定向,不能用ajax这种异步请求!
  • scope 有两种值,不需要用户感知的用静默授权(snsapi_base):

snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid)
snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )

  • 请求到的 code 只能使用一次
  • access_token 在微信有两种,一种是授权用的,与openid同时返回,只用于授权,没有请求次数限制;另一个种是基础token,每天最多请求2000次,请求subscribe字段要用这个access_token,得到他时只获得两个数据,access_token 和 expired,注意区分

具体代码:

整体流程:

 	//代码精简处理了,只写写大体,细节不介绍了,比如异常处理、日志记录之类的
	public function wechatAuth()
    {
        $wechat = new Wechat();
        // 是否微信内置浏览器登陆判断
        if ($wechat->isWeixin()){
        	  // 获取openId(这一步会先获取code,再用得到的code获取openid,同时会得到)
            $openId = $wechat->getOpenId();
            // 获取 client 的 access_token
            $accessToken = $wechat->getAccessToken();
			  // 获取用户信息
            $info = $wechat->getUserInfo();
            // 未关注返回true,即引到认证
            if (isset($info->subscribe) && $info->subscribe == 0){
                return true;
            }
        }
        return false;
    }

获取openid:

public function getOpenId($redirect = null, $scope = 'snsapi_base')
    {
        if (isset($this->openId)){
            return $this->openId;
        }

        // 如果之前session中存入了openId,则直接返回
        if (isset($_SESSION['openId'])){
            $this->openId = $_SESSION['openId'];
            return $_SESSION['openId'];
        }

        // 如果没有code,则先请求code,再从微信自动跳转回来
        // 这部分注释掉了,因为这个接口是ajax请求,被微信限制,所以code获取部分后来翻到了前段js里,如果在微信内,先通过window.location.href = ''去获取code,然后请求接口时再携带code来请求
//        if (!isset($_GET['code'])){
//            $redirect = empty($redirect)?'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] : $redirect;
//            $redirect = urlencode($redirect);
//            $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->appId}&redirect_uri=$redirect&response_type=code&scope=$scope&state=1#wechat_redirec";
//            header("Location:".$url);exit();
//        }

        $code = $_GET['code'];
        // 获取 openid 及 授权用的access_token
        $get_openid_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->appId.'&secret='.$this->secret.'&code='.$code.'&grant_type=authorization_code';
        $response = file_get_contents($get_openid_url);
        $userInfo = json_decode($response, true);

        // openid如有则存入session
        if (array_key_exists('openid', $userInfo)){
            $_SESSION['openId'] = $userInfo;
            $this->openId = $userInfo['openid'];
        }
        return $this->openId;
    }

获取access_token:

//这里只看原生的几句就行。因为微信授权域名只能设置两个,而有多个系统需要使用,所以做了一层代理,通过代理平台的接口获取access_token。
//而这个项目比较老,零几年的了,所以redis、memcache之类的都没有可用的,就直接写文件记录了,具体的失效处理就不写了。
public function getAccessToken($refresh = false)
    {
        // 微信原生方法
        $get_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->secret";
        $response = file_get_contents($get_token_url);
        $tokenInfo = json_decode($response, true);
        $accessToken = isset($tokenInfo['access_token'])? $tokenInfo['access_token'] : '';

        // 平台接口获取
        //$accessTokenFile = '/tmp/access_token';
        // 如果需要刷新token 或 token文件不存在,则重新请求token并写入文件
        //if ($refresh || !file_exists($accessTokenFile)){
        //    $accessTokenApi = '......';
        //    $res = file_get_contents($accessTokenApi);
        //    $accessToken = json_decode($res)->token;
        //    if (!is_dir('/tmp')){
        //        mkdir('/tmp', 777);
        //    }
        //    file_put_contents($accessTokenFile, $accessToken);
        //}else{// 否则直接取文件
        //    $accessToken = file_get_contents($accessTokenFile);
        //}
        //$this->accessToken = $accessToken;
        return $accessToken;
    }

获取用户信息:

 public function getUserInfo()
    {
        $get_user_info_url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=$this->accessToken&openid=$this->openId&lang=zh_CN";
        $response = file_get_contents($get_user_info_url);
        $info = json_decode($response);
        return $info;
    }

正常情况下,微信会返回下述JSON数据包:

{
    "subscribe": 1, 
    "openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 
    "nickname": "Band", 
    "sex": 1, 
    "language": "zh_CN", 
    "city": "广州", 
    "province": "广东", 
    "country": "中国", 
    "headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "subscribe_time": 1382694957,
    "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
    "remark": "",
    "groupid": 0,
    "tagid_list":[128,2],
    "subscribe_scene": "ADD_SCENE_QR_CODE",
    "qr_scene": 98765,
    "qr_scene_str": ""
}

其他

通过 js 获取 code 的代码:

<script>
    var oCode = '';
    function isWeixin() { //判断是否是微信
        var ua = navigator.userAgent.toLowerCase();
        return ua.match(/MicroMessenger/i) == "micromessenger";
    }

    function getUrlParam(name) {
        var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
        var r = window.location.search.substr(1).match(reg);
        if (r != null) return unescape(r[2]);
        return null;
    }

    function getWxCode() {
        var appId = 'wx133b*****3db0a';
        var url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appId + "&redirect_uri=" + location.href.split('#')[0] + "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
        var code = getUrlParam("code");
        if (!code) {
            window.location = url;
        } else {
            return code;
        }
    }
    // 如果是微信内登陆则重定向获取code
    if (isWeixin()){
        console.log('is weixin!');
        oCode = getWxCode();
        console.log(oCode);
    }
</script>
2018-04-19 16:54:03 ws932734384 阅读数 24729
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27856 人正在学习 去看看 秦子恒

        本人最近要做微信公众号网页开发的项目,其中有个需求是判断用户是否关注公众号,由于之前没有接触过微信授权的东西,所以提前开始做调研。在度娘上看了好多博客、百度知道、百度经验、知乎问答等,还仔细阅读了微信公众平台开发文档,大致了解到:

        微信网页授权分两种,第一种是snsapi_base(静默授权,用户无感知),第二种是snsapi_userinfo(第一次授权需要用户点击登录确认)。静默授权只需要两步就能拿到开发者需要的openID,而第二种授权方式,一共需要四步,可以拉取到用户信息(昵称、头像等)。具体过程这里不在赘述,参阅微信开发者文档。


        但是,本人发现一个不好的事情,获取到的用户信息里,并没有度娘告诉我的用于判断用户是否关注公众号的字段 subscribe 。然后,继续查阅博客、百度知道、百度经验、知乎问答,其中,有一篇博客让我如获至宝,下面是博客的截图:


        然后我就天真的相信,只有在unionID机制下,获取到的用户信息里才会有 subscribe 字段。后来,查看微信公众平台开发文档,其中有一段:


        那么,只有把公众号绑定到微信开放平台上才能使用unionID机制。所以自己就注册了一个微信开放平台,要绑定公众号的时候发现,只有完成开发者资质认证才能绑定。但是认证需要:



        以上只是一部分。这哪儿是我一个开发能做的事儿啊,所以向项目经理说明了情况,又向技术中心老大申请……,经过了一系列繁杂又不太顺利的流程。最后,让我来注册,需要什么材料找行政要。

        当然,在协调的过程中,我也没闲着,咨询了做过微信网页授权的同事,自己也继续翻阅微信开发文档(相当烂)、在本地尝试授权,获取用户信息,最终发现:不需要unionID机制,也能获取用户基本信息,拿到 subscribe 字段。那么正题来了!


微信网页授权并获取用户基本信息(是否关注公众号、头像、昵称等)步骤:  

          1、用户同意授权,获取code(使用静默授权即可)

               参阅 微信网页授权 第一步

            2、通过code换取  网页授权access_token  和 openID(此处的access_token为网页授权过程专用)

                参阅 微信网页授权 第二步

            3、使用AppId和AppSecret:获取access_token

                参阅  获取access_token

            4、使用openID和access_token获取用户基本信息

                参阅 获取用户基本信息(包括UnionID机制)

最终获取到的用户基本信息如下图:

        


        好了,到这里终于拿到了我需要的判断用户是否关注公众号的字段: subscribe 。


        饶了这么大圈子,有些感触:微信公众平台开发文档不容易看懂,unionID机制到底是啥,绑定了开放平台才叫unionID机制吗,那我现在这种调接口的方法(并没有绑定微信开放平台)属于unionID机制吗。

        再多说一句,其实这些逻辑,绝大部分是在后端完成的(access_token、appsecret安全等级都比较高)。所以,作为前端,只要调接口==》回调地址,再调接口==》得到用户基本信息。

2018-01-15 22:14:46 MYTLJP 阅读数 4952
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27856 人正在学习 去看看 秦子恒

用了好几个小时的时间,整理了一下关于公众号的思维导图,由于CSDN不能上传相对应的文件,所以萍子一一的分解开的截图附上来,希望对大家有所帮助哦~
因为是电脑设备自动截图,又鉴于内容比较多,可能不是太清楚,需要的小伙伴们,可以联系我,我可以随时发给你。

学习微信公众号需要的配置

这里写图片描述


微信开发的主体、请求方式、数据类型和环境

主体

这里写图片描述

请求方式

这里写图片描述
这里写图片描述

数据类型和环境

这里写图片描述


开始开发

获取access_token值并存储

这里写图片描述
这里写图片描述


账号管理

生成带参数的二维码

这里写图片描述

长链接转短链接

这里写图片描述


消息管理

获取微信服务器的IP地址

接收普通消息

接收事件推送

被动回复用户消息

这里写图片描述


微信网页授权

微信网页授权步骤

第一步:跳转页面,用户同意授权,获取code

这里写图片描述

第二步:通过code换取网页授权access_token(与普通的access_token不一样,具体见下方)
第三步:如果需要,刷新access_token值

这里写图片描述

第四步:拉取用户信息(需要scope为snsapi_userinfo)
第五步:附,检验授权凭证access_token是否有效,一般用不到

这里写图片描述


微信JS-SDK

说明

这里写图片描述

JS-SDK使用步骤

这里写图片描述

上传图片素材

这里写图片描述


微信公众号

握手协议

这里写图片描述

自定义菜单

自定义菜单类型

这里写图片描述

自定义菜单的设置

这里写图片描述

自定义菜单参数说明

这里写图片描述

获取自定义菜单

这里写图片描述


自定义菜单事件推送/被动回复用户信息

自定义事件推送

这里写图片描述

被动回复用户信息

这里写图片描述

根据菜单类型的点击,被动回复

点击按钮事件

这里写图片描述

公众号首次被某个用户关注的推送

这里写图片描述

微信扫一扫,并展示扫的内容

这里写图片描述

推送图文消息

这里写图片描述

回复图片消息
没有点击按钮

这里写图片描述

2016-12-26 20:17:21 qq_23842683 阅读数 52315
  • 微信支付开发-微信公众号开发12-微信开发php

    微信公众平台开发之微信支付开发是子恒老师《微信公众平台开发》视频教程的第12部。详细讲解了用php进行微信支付的开发。内容包含获取支付密钥,微信公众号支付开发,扫码支付,微信刷卡支付,异步处理支付结果等等。欢迎反馈,微信/QQ:68183131

    27856 人正在学习 去看看 秦子恒

 业务描述:当微信用户打开这个页面的链接即判断他/她是否已关注了“我”的公众号。
在微信开发文档中,有一个通过token和openid获取用户信息的接口:

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

返回参数:

参 数 说明
subscribe 用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。
openid 用户的标识,对当前公众号唯一
nickname 用户的昵称
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。

token通过appid、secret调用接口:

https://api.weixin.qq.com/cgi-bin/token?grant_type="+grant_type+"&appid="+AppId+"&secret="+secret

即可获取。(token的缓存后面再写)
 但现在这里出现可一个问题。当微信用户和“我”的公众号没有消息的交互,只是在微信浏览器中打开了一个朋友转发的网页链接,我该如何获取openid呢?毕竟,openid是微信用户针对某一个公众号而存在的。最后“我”通过隐式的网页授权登录,也就是网页授权的登录时scope的参数设置为”snsapi_base”。
通过网页授权code即可获取网页授权token信息以及openid.

/**
 * 判断用户是否关注了公众号
 * @param token
 * @param openid
 * @return
 */
public static boolean judgeIsFollow(String token,String openid){
    Integer subscribe
        String url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="+token+"&openid="+openid+"&lang=zh_CN";
    try {  
            URL urlGet = new URL(url);  
            HttpURLConnection http = (HttpURLConnection) urlGet.openConnection();  
            http.setRequestMethod("GET"); // 必须是get方式请求  
            http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
            http.setDoOutput(true);  
            http.setDoInput(true);  
            http.connect();  
            InputStream is = http.getInputStream();  
            int size = is.available();  
            byte[] jsonBytes = new byte[size];  
            is.read(jsonBytes);  
            String message = new String(jsonBytes, "UTF-8");  
            JSONObject demoJson = JSONObject.fromObject(message);  
            //System.out.println("JSON字符串:"+demoJson);  
            subscribe = demoJson.getInt("subscribe");

            is.close();  
    } catch (Exception e) {  
            e.printStackTrace();  
    }
    return 1==subscribe?true:false;
}

参考微信开发文档中的微信网页授权

判断用户是否关注公众号

博文 来自: peiyuanxin
没有更多推荐了,返回首页