大家好,最近小沃正在开发官网文章发布时推送到微信的功能,因此小沃总结了一些微信开发的小经验,这次开发主要运用到两个功能。一个是微信企业服务号获取用户信息的方法,另一个是微信发送模板消息的功能,考虑到时间问题,小沃今天就先只讲企业服务号获取用户信息的功能。
网页获取用户信息属于网页授权范畴,调用次数没有上线。但是考虑到用户体验,小沃还是建立了一张数据表专门用户存用户信息。
第一步:开通相关权限
首先,微信需要开通企业认证服务号权限。然后在左侧开发中的基本配置中获取当前服务好的appid与appsecret
将这两个值记录下来,然后在公共号设置中将业务域名,js安全域名与网页授权域名全部设置为您的当前绑定网站。(中途需要认证,就是上传一个文件到虚拟空间根目录去,很简单的。)
然后返回授权页面,并且点击“网页授权获取用户基本信息”,这样就可以跳转到开发文档页的对应位置去了。
第二步:获取用户认可code
网页获取用户信息有两种方法,第一种是base模式,第二种是userinfo模式。第一种只能获取用户的openid,而第二种可以获取用户的大部分信息。
这一步的获取方式是跳转到微信的特定页面去,请注意,必须微信页面跳过去,不能是ajax之类的方法。
base模式的跳转地址为
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
userinfo模式的跳转地址为
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
其中红色部分是我们要输入的参数。
appid就不多说了,之前要您这边记录的。
redirect_uri是回调的uri地址,之前有说过,微信认证是必须跳过去的,因此也必须要跳回来是不是。那么,怎么跳回来呢,就是利用redirect_uri这个参数,告诉微信的认证服务器,你直接跳回来到这个地址就可以了。跳回来时会利用get提交方式送一个参数过来,那个参数就是,code。也就是说它会在回掉的redirect_uri后添加一个code。
state参数是一个可有可无的参数,它只是会在回调时将这个参数送回来,由于是重新跳回来,所以微信的设计者可能是为了让其区分一下是哪种跳过去导致的跳回来或是哪次跳过去导致的跳回来吧。
这两个授权不同的地方在于user_info需要用户点击确认才会返回,base对于用户是完全透明的,确认页面类似这样。
第三步:获取openid
在跳转回来的页面中,利用已经获取到code,通过gei的方式直接获取用户的openid与access_token。(这里的access_token与那个一天只能调用2000次的不是同一个)。
微信给的网址为:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
还是一样,红色的为参数。
php的话直接使用file_get_contents函数就可以了。将会获取一个json字符串。
如果第二步用的是base模式,这里获取openid发现服务器已经存在记录,这里就可以停了。
如果检测到没有记录,又需要获取很多的用户数据,就需要重新执行第二步的操作了。
下面的内容就是当发现需要添加用户信息时才要的操作。
第三步:再做一次跳转
这一步的前提是第二步用的是user_info模式哦。这一步很简单,同样是利用get的方式获取用户详细信息。
微信给的网站为:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
大家注意,access_token第二步返回的数据中又,openid也有,所以直接get提交即可。
例如php,这里就可以直接执行$json = file_gei_contents("https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN");了。
第四步:将获取到的数据写入数据库
这一步看上去很简单,但是有一点必须强调下。不能在获取后直接存入。至于为什么,这是根据小沃的经验得到的结论。
微信可能不仅仅跳转回来一次,可能有对回掉地址发ajax或是其他,反正就是小沃做过实验,微信跳回来的那个页面每次有像是被访问过两次的情况发生,对于修改数据库的操作,这是非常危险的。
在这里,我们获取到了要写入数据库的材料,我们在这一步中必须利用前端的技术再次跳转到新的页面,如利用js,301,302跳转等方式。(因为小沃发现的现象中,ajax是不会执行前端代码的)
当跳转到新的页面后,再写如数据库。
下面小沃分享一下自己写的代码。
$appid=get_option("wc_appid"); $appsecret=get_option("wc_appsecret"); $redirect_uri=urlencode("weichat.php"); if(isset($_GET["code"])) { $code = $_GET["code"]; $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$appsecret."&code=".$code."&grant_type=authorization_code"; $json = file_get_contents($url); $arr = json_decode($json); if(isset($arr -> errcode)) { $msg = $json; } else { $openid = $arr -> openid; $access_token = $arr -> access_token; if(isset($_GET["state"])) { if($_GET["state"] == "base") { $sql = $wpdb -> prepare("SELECT COUNT(*) FROM `weichat_user` WHERE `openid` = '%s'", $openid); $usernum = $wpdb -> get_var($sql); if($usernum != 0) { $msg = "您已经订阅过本网站了"; } else { header("https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_userinfo&state=userinfo#wechat_redirect"); } } else if($_GET["state"] == "userinfo") { $json = file_get_contents("https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN"); $arr = json_decode($json); if(isset($arr -> errcode)) { $msg = $json; } else { if(isset($arr -> openid)) { header("index.php?do=mobile&mo=weichat&userdata=".urlencode($json)); } else { $msg = "未获取到openid"; } } } } } } else if(isset($_GET["userdata"])) { $json = urldecode($_GET["userdata"]); $arr = json_decode($json); $args = array(); $args["openid"] = $arr -> openid; if(isset($arr -> nickname)) $args["nickname"] = $arr -> nickname; else $args["nickname"] = "未知"; if(isset($arr -> sex)) $args["sex"] = $arr -> sex; else $args["sex"] = 0; if(isset($arr -> language)) $args["language"] = $arr -> language; else $args["language"] = "未知"; if(isset($arr -> city)) $args["city"] = $arr -> city; else $args["city"] = "未知"; if(isset($arr -> province)) $args["province"] = $arr -> province; else $args["province"] = "未知"; if(isset($arr -> country)) $args["country"] = $arr -> country; else $args["country"] = "未知"; if(isset($arr -> headimgurl)) $args["headimgurl"] = $arr -> headimgurl; else $args["headimgurl"] = "未知"; if(isset($arr -> privilege)) $args["privilege"] = json_encode($arr -> privilege, JSON_UNESCAPED_UNICODE); else $args["privilege"] = "未知"; if(isset($arr -> unionid)) $args["unionid"] = $arr -> unionid; else $args["unionid"] = "无"; $wpdb -> insert("weichat_user", $args, array("%s", "%s", "%d", "%s", "%s", "%s", "%s", "%s", "%s", "%s")); $msg = "订阅成功"; } else { header("https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$appid."&redirect_uri=".$redirect_uri."&response_type=code&scope=snsapi_base&state=base#wechat_redirect"); }
说明一下:所有跳转都是再weichat.php内部跳的,程序利用get参数区分当前是哪一次的。
如果有人想开发微信服务好程序,可以联系小沃哦。小沃别的不敢说,技术与服务一定是没有问题的。