2017-09-20 10:10:20 towtotow 阅读数 596
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

在进行微信公众号开发时,

不可避免的会遇到程序出错,

但是微信开发跟本地开发不同,


7error_message.jpg


本地开发时,

你可以通过调整错误级别来显示错误提示,

方便你调试程序,

但是微信开发时是没有错误信息提示的。


这里应该怎么获取公众平台开发过程中的错误信息呢…

微信开发获取出错信息,进行错误调试视频教程在线观看

http://edu.csdn.net/course/detail/2586/40528

2016-12-12 11:45:37 u012178818 阅读数 953
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

  是不是大家经常能在微信公众号上访问某家应用的时候弹出这样一个页面,当你点击确定之后,你进入这家应用的时候会惊奇的发现,你已经登录好了,并且你的微信信息都被他采集到了。

  这是怎么做的呢,首先我们得了解几个微信开发接口。

  1,授权接口

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

  2,获取access_token

  

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


  3,获取用户信息

  注意:调用此接口的前提,授权接口的scope必须为snsapi_userinfo,如果你不需要获取用户的相关信息,只需要获取用的openid,那本接口就不用调用到。

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

   

  上述三个接口为微信平台提供的api,具体可以参考官方文档。

  

   下面是我写的一个简单的例子:


   OauthGetCode.java

@RequestMapping(value = "/doOAuthLogin")
	public String doOAuth(HttpServletRequest request, HttpServletResponse response

	) throws IOException {

		String appid = ConfigUtils.APPID;
		String redirectUrl = ConfigUrlUtils.YUMING + "exhibitFront/OAuthLogin";
		String state = "0";
		request.setAttribute("appid", appid);
		request.setAttribute("redirect_url", redirectUrl);
		request.setAttribute("outTradeNum", state);

		return "utils/OAuthGetCode";

	}

   OauthGetCode.jsp

<%@ page language="java" pageEncoding="utf-8"%>
<html>
	<head>
		<meta name="viewport" content="width=device-width,user-scalable=0">
	</head>
	<body>
		<script language="javascript" type="text/javascript">
	window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid }&redirect_uri=${redirect_url }&response_type=code&scope=snsapi_userinfo&state=${outTradeNum }#wechat_redirect";
</script>



	</body>
</html>
 

  OAuthLogin.java

@RequestMapping(value = "/OAuthLogin")
	public String oauthLogin(HttpSession session, HttpServletRequest request, @RequestParam(value = "code") String code,
			Model model) {

		// 获取用户的openid
		String returnJSON = HttpTool.getToken(ConfigUtils.APPID, ConfigUtils.APPSECRET, "authorization_code", code);
		JSONObject obj = JSONObject.fromObject(returnJSON);
		System.out.println(obj);//获取到的用户信息
		String openid = obj.get("openid").toString(); //例:获取用户信息,详细可以参考下面进行获取
		/*
		 * 可获取的用户信息:
		openid	用户的唯一标识
		nickname	用户昵称
		sex	用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
		province	用户个人资料填写的省份
		city	普通用户个人资料填写的城市
		country	国家,如中国为CN
		headimgurl	用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
		privilege	用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
		unionid	只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)
		
		*/
		

		return "redirect:/exhibitFront/index";

	}


   特别注意:测试授权获取用户信息必须要有公众号且开通了相应接口功能,

 此处需要修改成自己访问的域名地址,否则会授权不通过的哦。

   


2018-09-09 16:17:57 qq_41971087 阅读数 4843
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

在微信开发中,就有一些接口会涉及到获取接口凭证的接口,开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183

比如我们在微信公众号创建菜单中就会有获取接口凭证要去,还有就是微信小程序在做消息推送功能时也会有调用access_token获取微信接口凭证的要求

获取access_token:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

参数:

grant_type:默认添client_credential

appid:第三方用户唯一凭证 (微信后台中获取)(微信用户唯一的)

secret:第三方用户唯一凭证密钥,即appsecret(微信后台中获取)(微信用户唯一的)

返回过来的参数:

access_token:获取到的凭证(这个凭证是需要保存起来,获取的次数是有限制的)

expires_in:凭证的时间

这个接口凭证,我自己是获取当前的时间搓加上凭证时间保存在数据库中,当使用时凭证时,都会去数据库中查询,用时间去进行比较看是否过期,过期就重新调用接口凭证,除了这种还可以放到Redis缓存中进行保存

代码实例:

Httprequests.java(发送请求的工具类)


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
/**
 * <p>User: qrn
 * <p>Date: 14-1-28
 * <p>Version: 1.0
 * 描述: http发起请求:
 */
public class Httprequests {


    public static void main(String[] aegs) {
        String string = Httprequests.sendGet("http://v.qq.com/x/cover/kvehb7okfxqstmc.html?vid=e01957zem6o","");
        System.out.print(string);
    }

    public static String  sendGet (String url,String param) {
        String result ="";
        BufferedReader in  =null;
        try {
            String urlNameString = url +"?" +param;
            System.out.println("发送的链接请求:"+urlNameString);
            URL reaurl = new URL(urlNameString);

            URLConnection connection  = reaurl.openConnection();

            //设置通用
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");

            //建立实际的连接
            connection.connect();

            Map<String, List<String>> map = connection.getHeaderFields();
            //定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }


    /**
     * 向指定 URL 发送POST方法的请求
     * @param url 发送请求的 URL
     * @param param 参数
     * @return String 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(url);
            // 打开和URL之间的连接
            URLConnection conn = realUrl.openConnection();
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            out = new PrintWriter(conn.getOutputStream());
            
            // 发送请求参数
            out.print(param);
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送 POST 请求出现异常!"+e);
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result;
    }


    /**
     * 拿到ip
     * @param req request作用域:
     * @return String
     */
    public static String getRemoteIP(HttpServletRequest req) {
        String ip = req.getHeader("X-Real-IP");

        if (ip == null || ("").equals(ip)) {
            ip = req.getRemoteAddr() == null ? "127.0.0.1" : req.getRemoteAddr();
        }
        return ip;
    }

    /**
     *  生成
     * @param num 参数
     * @return String
     */
    public static String getPamens(Integer num){
        String base = "abcdefghijklmnopqrstuvwxyz0123456789";
        Random random = new Random();
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < num; i++) {
            int number = random.nextInt(base.length());
            sb.append(base.charAt(number));
        }
        return sb.toString();
    }
}

 

TokenServiceImpl.java(获取接口):

    /**
     * 接口凭证:
     */
    @Override
    public Map<String, Object> access_token() {
         String param="grant_type="+WeChatTool.access_token_grant_type+"&appid="+WeChatTool.wxspAppid+"&secret="+WeChatTool.wxspSecret;
          //获取接口凭证
                 String sendGet=Httprequests.sendGet(WeChatTool.select_access_token,param);
                 System.out.println("发送git请求的返回值:"+sendGet);
                 JSONObject json = JSONObject.fromObject(sendGet);       
                 String access_token=json.getString("access_token"); //凭证
                 System.out.println("获取的access_token:"+access_token);
                 int expires_in= json.getInt("expires_in"); //凭证有效时间,单位:秒
                 System.out.println("有效的时间:"+expires_in);
                 System.out.print("获取凭证成功");
                 System.out.println("返回的数据:"+access_token);
                 Map<String, Object> map = new HashMap<String, Object>();
                 map.put("access_token", access_token);
                 map.put("expires_in", expires_in);
                 return map;
    }

这样就可以获取到接口凭证了,希望都微信开发的朋友会有一点帮助,如果有疑问请在下发评论。

 

 

2019-04-02 23:09:46 weixin_38361347 阅读数 92
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

微信网页授权

所谓的微信网页授权说白了就是 用户微信客户端内访问第三方网页,公众号可以根据网页授权这个机制来获取用户的基本信息,然后进行相应的逻辑处理。

官方文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

准备工作:

1 微信为我们提供了相应的测试账号

可以参考文档 第二章 “微信开发之环境搭建”

或者直接看官方文档 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login

2 填写自己的服务器url 用于接收微信返回事件xml数据。

在这里插入图片描述

3 添加自己的 网页授权回调域名

关于网页授权回调域名的说明

1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的“ 开发 - 接口权限 - 网页服务 - 网页帐号 - 网页授权获取用户基本信息”的配置选项中,修改授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头;

2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.htmlhttp://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.comhttp://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权

3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可

在这里插入图片描述

配置回调域名 :

在这里插入图片描述

点击修改 填写自己的回调域名,开头不需要以 http:// 或者 https:// 开头

在这里插入图片描述

需要注意此处的access_token区别

关于网页授权access_token和普通access_token的区别

1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;

2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

关于网页授权的两种scope的区别说明

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

关于以上1,2 两种scope机制对比

网页授权方式 是否提示授权 获取信息
snsapi_base 只能获取openid
snsapi_userinfo 可获取到更详细的信息包括openid,昵称,地址等等

snsapi_userinfo 会显示下面授权页面,snsapi_base是不会显示的!

img

第三条说明即是 :

​ 用户和公众号产生消息交互或关注后事件推送后(xml数据),可以根据xml数据中的用户openid调用 “获取用户基本信息接口”获取用户详细信息,但这个前提是用户必须先关注公众号!

关于特殊场景下的静默授权

1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;

2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。

步骤主要分为四步:

第一步:用户同意授权,获取code

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

尤其注意:由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

参考链接(请在微信客户端中打开此链接体验):

scope为snsapi_base

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect

scope为snsapi_userinfo

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

参数说明

参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

redirect_uri 的url 需要我们自己来定义。

如点击url进入 第三方网页url

    //授权后跳转的url地址
    String redirect_uri ="http://www.udeam.com" + "/getUserInfo";
    String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri="+ redirect_uri +"&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
	//设置自己的appid 和 授权机制
    url = url.replace("APPID","xxxxxxxxxxxxxxx").replace("SCOPE","snsapi_userinfo");

授权后跳转的url地址 controller

/**
 * 网页授权获取用户信息  用户同意授权 , 获取code
 * @param code
 * @return 页面
 */
@GetMapping("getUserInfo")
public String getUserInfo(String code){
    logger.info("code = " + code);
    //获取用户信息
    String userAuthorzation = UserService.userAuthorzation(code);
    //返回数据错误
    if (userAuthorzation.equals("error")){ return "500";}

    return "sucess";
}

第二步:通过code换取网页授权access_token

首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。公众号可通过下述接口来获取网页授权access_token。如果网页授权的作用域为snsapi_base,则本步骤中获取到网页授权access_token的同时,也获取到了openid,snsapi_base式的网页授权流程即到此为止。

尤其注意:由于公众号的secret和获取到的access_token安全级别都非常高,必须只保存在服务器,不允许传给客户端。后续刷新access_token、通过access_token获取用户信息等步骤,也必须从服务器发起。

请求方法

获取code后,请求以下链接获取access_token:

  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参数说明

参数 是否必须 说明
appid 公众号的唯一标识
secret 公众号的appsecret
code 填写第一步获取的code参数
grant_type 填写为authorization_code

返回说明

正确时返回的JSON数据包如下:

{
    "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE" 
 }
参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope 用户授权的作用域,使用逗号(,)分隔

错误时微信会返回JSON数据包如下(示例为Code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

第三步:刷新access_token(如果需要)

由于access_token拥有较短的有效期,当access_token超时后,可以使用refresh_token进行刷新,refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。

请求方法

获取第二步的refresh_token后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
参数 是否必须 说明
appid 公众号的唯一标识
grant_type 填写为refresh_token
refresh_token 填写通过access_token获取到的refresh_token参数

返回说明

正确时返回的JSON数据包如下:

{ 
    "access_token":"ACCESS_TOKEN",
    "expires_in":7200,
    "refresh_token":"REFRESH_TOKEN",
    "openid":"OPENID",
    "scope":"SCOPE" 
}
参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识
scope 用户授权的作用域,使用逗号(,)分隔

错误时微信会返回JSON数据包如下(示例为code无效错误):

{"errcode":40029,"errmsg":"invalid code"}

第四步:拉取用户信息(需scope为 snsapi_userinfo)

” 拉取用户信息 “ 前提 是 网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。

请求方法

http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

参数说明

参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
openid 用户的唯一标识
lang 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语

返回数据说明

正确时返回的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"
}
参数 描述
openid 用户的唯一标识
nickname 用户昵称
sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
province 用户个人资料填写的省份
city 普通用户个人资料填写的城市
country 国家,如中国为CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。
privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
unionid 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

错误时微信会返回JSON数据包如下(示例为openid无效):

{"errcode":40003,"errmsg":" invalid openid "}

通过code 获取 网页access_token 和 用户信息 代码实现

/**
 * 网页授权获取用户信息  用户同意授权 , 获取code
 * @param args
 */
public static String userAuthorzation(String code){
    //2 通过code换取网页授权access_token
    String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    url=url.replace("APPID","xxxxxx").replace("SECRET","xxxxxxxxx").replace("CODE",code);
    String result = HttpUtil.sendHttpByGet(url);//发送请求
    logger.info("通过code换取网页授权access_token 的 result = " + result);

    /**
     * 正确时返回的JSON数据包如下:
     * { "access_token":"ACCESS_TOKEN",
     * "expires_in":7200,
     * "refresh_token":"REFRESH_TOKEN",
     * "openid":"OPENID",
     * "scope":"SCOPE" }
     * 错误时微信会返回JSON数据包如下(示例为Code无效错误):
     * {"errcode":40029,"errmsg":"invalid code"}
     */
    JSONObject jsonObject = JSONObject.parseObject(result);
    String access_token = jsonObject.getString("access_token");
    String openid = jsonObject.getString("openid");

    //返回的数据是后出错
    if(jsonObject!=null && jsonObject.toJSONString().contains("errcode")){
        logger.info("通过code换取网页授权access_token 返回数据时出错!");
        return "error";
    }
    //第三步:刷新access_token(如果需要)
    //第四步:拉取用户信息(需scope为 snsapi_userinfo)
    String userMsg = getUserMsg(openid);
    jsonObject = JSONObject.parseObject(userMsg);
    if(jsonObject!=null && jsonObject.toJSONString().contains("access_token")) {
        logger.info("拉取用户信息 ! " + jsonObject.toJSONString());
        return jsonObject.toJSONString();
    } 

    logger.info("拉取用户信息失败!  " + result);
    
    return "error";
}
2016-12-08 10:01:41 hanzhihuihan 阅读数 2676
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

最近在研究微信接口开发,由于工作需要,需要开发出公众号对应的关注者openid、昵称等信息,在网上搜了一下没发现类似文章,故将自己开发的列出来,供大家参考。

基本流程是:1 获取关注者的openid列表 ----》2再批量获取opendid、昵称等信息。

特列出具体代码:

1 定义两个类:

class obj_openid  ///定义openid对象
{
public $openid="";
public $lang="";
}
class obj_wxuser ///定义微信用户
{
public $openid="";
public $nickname="";
}

2  批量获取关注者openid

public static function getUserList( $next_id = '' ){
        $access_token = self::getToken();
        $extend = '';
        if( !empty($next_id) ){
            $extend = "&next_openid=$next_id";
        }
        $url = self::API_URL . "/cgi-bin/user/get?access_token={$access_token}$extend";


        $ret = json_decode( 
                curl_get( $url ),
            true
        );


        return self::getResult( $ret ) 
            ? array(
                'total'   => $ret['total'],
                'list'    => $ret['data']['openid'],
                'next_id' => isset( $ret['next_openid'] ) ? $ret['next_openid'] : null
            ) 
            : null;
    }


3 批量获取关注者信息,包括openid、nickname等,本例只是获取这两项


public static function batGetUserinfo(){
        $access_token = self::getToken();
        $url = self::API_URL . "/cgi-bin/user/info/batchget?access_token={$access_token}";
$list_openid=self::getUserList();
$count=count($list_openid["list"]);
$i=0;
$ret="{\"uils\":[";
$arr_openid=array();
$arr_wxuser=array();
foreach ($list_openid["list"] as $value)
{
$i++;
$obj=new obj_openid();
$obj->openid=$value;
$obj->lang="zh-CN";
array_push($arr_openid,$obj);
if($i%100==0)   //因为微信官方只支持一次最多获取100个人的信息,故需多次提交
{
$str_post="{\"user_list\":".json_encode($arr_openid)."}";
$ret= $ret.curl_post( $url, $str_post).",";
$arr_openid=array();
}
}
if(count($arr_openid)>0)
{
$str_post="{\"user_list\":".json_encode($arr_openid)."}";
$ret =$ret.curl_post( $url, $str_post)."]}";
}
else
{
$ret =$ret."]}";
}
$ret =json_decode($ret, true );
        return self::getResult( $ret ) ? $ret : null;
    }


4  调用上述方法获得列表:

$ret = weixin::batGetUserinfo();
$count=count($ret["uils"]);
$j=0;
//echo $count;
for($i=0;$i<$count;$i++)
{
foreach($ret["uils"][$i]["user_info_list"] as $val)
{

                //我这里只获取了openid、nickname两项,如需获取更多请参考微信具体接口文档
$j++;
echo $j."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$val['openid']."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$val['nickname']."<br/>";
}
}

 5 最终结果如下图:



微信开发学习

阅读数 38

没有更多推荐了,返回首页