2017-07-15 00:54:57 snakeMoving 阅读数 3131
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

之前没有接触过微信开发,出来工作后第一份工作是做微信开发,我的任务只是写一个接口。

进入正题,微信开发,本文的微信开发是指微信公众号开发,本文从微信开发的最基础部分做一个简单的记录,并且附上自己写的一段代码。

openid:openid其实就是一个数据库主键,是腾讯为每个公众号的唯一标识

userinfo:其实就是用户信息,这些可以授权获取到的信息及其有限,就是用户名性别地址之类的

其实微信开发文档写得很清楚了,本人啰嗦了点所以记下来了

一般我们进入一个公众号,它可能会让我们授权,其实这样他就获取到我们的信息,他可以保存到数据库,作为会员信息,这样就省去了注册的一个步骤

首先获取授权这一步,其实是开发者后台获取用户code的一个手段,code可以干嘛?code可以作为一个钥匙,通过微信提供的接口,携带着开发者的appid和秘钥,以及code

就可以获取到用户的openid和accesstoken,其实获取到这2个没什么卵用,然后你可以利用openid和accesstoken通过另外一个接口获取到用户信息,这就有用啦。

以下附上自己写的菜得抠脚的代码,还忘个各位大佬完善一些细节

package wechat.Common;

/**
 * Created by sam on 2017/7/13.
 */

/**
 * 授权后重定向的回调链接地址,请使用urlEncode对链接进行处理
 * 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),
 * snsapi_userinfo (弹出授权页面可通过openid拿到昵称、性别、所在地。
 * 并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
 */
public class URLBean {
    public static final String appid = "这个写自己的";
    public static final String appsecret = "这个写自己的";
    public static final String GETCODE
            = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE#wechat_redirect";
    public static final String GETACCESSTOKENANDID
            = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    public static final String REFRESHTOKEN
            = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN ";
    //需要用get访问,https协议
    public static final String USERINFO
            = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    public static final String BASEURL = "/grant/getCode?visitUrl=VISIT";
    public static final String PROJECT_URL = "http://2691670703.tunnel.qydev.com/WeChat";
}
package wechat.Common;

import org.apache.log4j.Logger;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * Created by sam on 2017/7/13. 
 */
public class WechatFilter implements Filter{

	private Logger logger = org.apache.log4j.Logger.getLogger(this.getClass());

    public void init(FilterConfig filterConfig) throws ServletException {
        //
    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        HttpSession session = request.getSession();
        String openId = (String) session.getAttribute("openid");
        String URL = request.getRequestURI();
        if(isNeedGrant(URL)){
			if(openId!=null){
				filterChain.doFilter(request,response);
			}else{
				String queryString = request.getQueryString();
				String redirect_url = "";
				if(queryString!=null) {
					redirect_url = request.getRequestURL().toString()+"?"+queryString;
				}else {
					redirect_url = request.getRequestURL().toString();
				}
				String url  = URLBean.PROJECT_URL+URLBean.BASEURL.replace("VISIT",URLEncoder.encode(redirect_url, "UTF-8"));
				String target = URLBean.GETCODE.
						replace("APPID",URLBean.appid).
						replace("SCOPE","snsapi_userinfo").
						replace("REDIRECT_URI", url);
				response.sendRedirect(target);
			}
		}else{
			filterChain.doFilter(request,response);
		}

    }

    public void destroy() {
        //
    }
	/**
	 * 需要判断是否拉取openid不然它会无限循环进来
	 */
	public boolean isNeedGrant(String url){
		//判断是否是正在走向我定义好的接口
//		if (url.contains("/grant/getCode")){
//			return true;
//		}
//		return false;
		return true;
	}
}
package wechat.Common;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import wechat.Entity.WeChatUser;
import wechat.Service.WeChatUserService;

import java.net.URLDecoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Created by sam on 2017/7/13.
 */
@Controller
@RequestMapping("/grant")
public class Grant {
	private Logger logger = Logger.getLogger(this.getClass());
	@Autowired
	private WeChatUserService weChatUserService;
	//Illegal character in scheme name at index 0
    @RequestMapping("/getCode")
    public void getCode(HttpServletRequest HttpServletRequest, 
    		HttpServletResponse httpServletResponse)throws Exception{
        //这里拉取code,然后重定向到获取openId和accessToken的地址
    	HttpSession httpSession =  HttpServletRequest.getSession();
    	String code = HttpServletRequest.getParameter("code");
    	String redirect_url = HttpServletRequest.getParameter("visitUrl");
    	redirect_url = URLDecoder.decode(redirect_url,"UTF-8");
    	String url = URLBean.GETACCESSTOKENANDID.replace("APPID", URLBean.appid).
    			replace("SECRET", URLBean.appsecret).replace("CODE", code);
    	String resp = HttpClientUtil.doGet(url);
    	AccessTokenOpenId ao = JsonUtils.jsonToPojo(resp, AccessTokenOpenId.class);
    	String openId = ao.getOpenid();
    	httpSession.setAttribute("openid", openId);
    	WeChatUser chatUser = weChatUserService.getWeChatUserByOpenId(openId);
    	if(chatUser==null) {
    		String userinfojson = HttpClientUtil.doGet(URLBean.USERINFO
    				.replace("ACCESS_TOKEN",ao.getAccess_token()).replace("OPENID", ao.getOpenid()));
    		chatUser = JsonUtils.jsonToPojo(userinfojson, WeChatUser.class);
    		weChatUserService.insert(chatUser);
    	}
    	httpSession.setAttribute("user",chatUser);
    	httpServletResponse.sendRedirect(URLDecoder.decode(redirect_url, "UTF-8"));//跳转用户最原始访问的连接
    }
 
}
里面有一些需要完善的地方,需要各位大佬自己修改一下,我写不出优雅的代码,就这样吧,仅此记录而已 --Sam

2019-04-22 22:07:02 Aero_K 阅读数 1255
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

如上图

从最新的微信小程序开发文档中查阅,通过微信小程序接口 wx.getLocation() 依然不能够直接获取到用户具体城市信息。本文写的主要是如何通过从微信API获取的经纬度信息转化为具体的城市街道信息。

首先如果开发者想要获取用户当前的位置,地理信息等,需要先在app.json中配置permission字段,如果用wepy开发的话,需在app.wpy做相应的配置:如下

permission: {
  "scope.userLocation": {
     "desc": "你的位置信息将用于小程序位置接口的效果展示"
  }

第二步:进入页面,调用wx.getSetting拿到用户的授权情况。

第三步:调用wx.getLocation API 获取返回的经纬度,速度等信息

第四步:因为微信没有将经纬度直接转换为地理位置,因此这里需要通过借助微信位置服务,或者百度地图开放平台的全球逆地址编码。(这里本人利用的是百度开放平台,这里ak码是需要向百度地图开放平台获取的~,请求时填入相应的ak码,经纬度等信息。

第五步:用户进入页面的时候,可在页面的onShow方法中执行wx.getLocation让用户进行相应的授权,以后每次进入该页面时,通过wx.getSetting接口,返回用户授权具体信息。

具体代码如下:

onShow() {
    this._getUserLocation();
}
  _getUserLocation () {
    var self = this
    wx.getSetting({
      success: (res) => {
        console.log('用户授权情况', res)
        //未授权
        if(res.authSetting['scope.userLocation'] !== undefined &&     
         res.authSetting['scope.userLocation'] !== true) {
          wx.showModal({
            title: '请求授权当前位置',
            content: '需要获取您的地理位置,请确认授权',
            success: function (res) {
              console.log(res)
              if(res.cancel){
                wx.showToast({
                  title: '拒绝授权',
                  icon: 'none',
                  duration: 1000
                })
              } else if (res.confirm) { //确认授权, 通过wx.openSetting发起授权请求
                wx.openSetting({
                  success: function (res) {
                    if(res.authSetting["scope.userLocation"] == true) {
                      wx.showModal({
                        title: '授权成功',
                        icon: 'success',
                        duration: 1000
                      })
                      self._getCityLocation()
                    } else {
                      wx.showModal({
                        title: '授权失败',
                        icon: 'none',
                        duration: 1000
                      })
                    }
                  }
                })
              }
            }
          })
        } else if (res.authSetting['scope.userLocation'] == undefined) {
          self._getCityLocation()
          console.log('这个为undefined')
        } else {
          console.log('授权成功')
          self._getCityLocation()
        }
      }
    })
  }
  _getCityLocation(){
    let self = this
    wx.getLocation({
      type: 'wgx84',
      success: (res) => {
        let latitude = res.latitude
        let longitude = res.longitude
        let speed = res.speed
        wx.request({
          url: 'http://api.map.baidu.com/geocoder/v2/?ak=Vh0ALNzHjjEm5RP0Ie16dlBhZbdEQip9&location=' + res.latitude + ',' + res.longitude + '&output=json',
          data: {},
          header: { 'Content-type': 'application/json' },
          success: function (ops){ 
            console.log(ops)
            self.address = ops.data.result.addressComponent.city + 
            ops.data.result.addressComponent.district
          },
          fail: function (resq) {
            wx.showModal({
              title: '信息提示',
              content: '请求失败',
              showCancel: false,
              confirmColor: '#f37938'
            });
          }
        })
      },
      fail: (res) => {
        wx.showModal({
          title: '信息提示',
          content: '请求失败',
          showCancel: false,
          comfirmColor: '#f37938'
        })
      }
    })
  }

效果如下

用户首次进入页面时会先先请求用户授权地理位置权限

用户拒绝授权后

用户拒绝授权后再次进入该页面:

用户同意授权后:

 

2018-05-26 02:16:10 weixin_42262436 阅读数 58108
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

    微信小程序-获取当前城市位置

   1, 获取当前地理位置,首先要拿到用户的授权wx.openSetting;

    2,微信的getLocation接口,获取当前用户的地理位置(微信返回的是经纬度,速度等参数);

    3,微信没有将经纬度直接转换为地理位置,借用腾讯位置服务中关于微信小程序的地理转换JS SDK 的API(返回信息中包括国家,省,市,区,经纬度等地理位置)

步骤描述清楚以后,下面就开始按步骤操作了;(本文仅仅讲述如何获取用户地理位置的授权)

图示为获取用户地理位置授权弹窗


在用户首次进入某页面(需要地理位置授权)时候,在页面进行onLoad,onShow时候,进行调用wx.getLocation要求用户进行授权;以后每次进入该页面时,通过wx.getSetting接口,返回用户授权具体信息。

wx.getSetting接口具体API地址链接为点击打开链接


上图中scope.userLocation就是地理授权的标志;

当该标志是underfind,表示用户初次进入该页面,当该标志是false,表示用户初次进入该页面拒绝了地理授权,应进行重新要求获取授权。

    wx.getSetting({
      success: (res) => {
        console.log(JSON.stringify(res))
        // res.authSetting['scope.userLocation'] == undefined    表示 初始化进入该页面
        // res.authSetting['scope.userLocation'] == false    表示 非初始化进入该页面,且未授权
        // res.authSetting['scope.userLocation'] == true    表示 地理位置授权
        if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) {
          wx.showModal({
            title: '请求授权当前位置',
            content: '需要获取您的地理位置,请确认授权',
            success: function (res) {
              if (res.cancel) {
                wx.showToast({
                  title: '拒绝授权',
                  icon: 'none',
                  duration: 1000
                })
              } else if (res.confirm) {
                wx.openSetting({
                  success: function (dataAu) {
                    if (dataAu.authSetting["scope.userLocation"] == true) {
                      wx.showToast({
                        title: '授权成功',
                        icon: 'success',
                        duration: 1000
                      })
                      //再次授权,调用wx.getLocation的API
                      
                    } else {
                      wx.showToast({
                        title: '授权失败',
                        icon: 'none',
                        duration: 1000
                      })
                    }
                  }
                })
              }
            }
          })
        } else if (res.authSetting['scope.userLocation'] == undefined) {
          //调用wx.getLocation的API
        }
        else {
          //调用wx.getLocation的API
        }
      }
    })

在拿到用户授权以后,使用微信的API获取当前位置的经纬度微信获取位置API


这里,我们进行使用的是腾讯位置服务;专为小程序开发者提供LBS数据服务工具包,可以在小程序中调用腾讯位置服务的POI检索、关键词输入提示、地址解析、逆地址解析、行政区划和距离计算等数据。
    1,得到开发者秘钥

    2,下载微信小程序javaScriptSDK,

    3,安全域名设置,在“设置” -> “开发设置”中设置request合法域名,添加http://api.map.qq.com

在文件中引入对应的javaScriptSDK文件

var QQMapWX = require('../../../utils/qqmap-wx-jssdk.js');
var qqmapsdk;

在文件中进行js调用,


最后的结果就是可以获得自己所在城市的具体位置了



index.js部分的代码

//index.js
//获取应用实例
const app = getApp();
var QQMapWX = require('../../../utils/qqmap-wx-jssdk.js');
var qqmapsdk;
Page({
  data: {
    province: '',
    city: '',
    latitude: '',
    longitude: ''
  },
  onLoad: function () {
    qqmapsdk = new QQMapWX({
      key: 'XXXX-XXXX-XXXX-XXXX' //这里自己的key秘钥进行填充
    });
  },
  onShow: function () {
    let vm = this;
    vm.getUserLocation();
  },
  getUserLocation: function () {
    let vm = this;
    wx.getSetting({
      success: (res) => {
        console.log(JSON.stringify(res))
        // res.authSetting['scope.userLocation'] == undefined    表示 初始化进入该页面
        // res.authSetting['scope.userLocation'] == false    表示 非初始化进入该页面,且未授权
        // res.authSetting['scope.userLocation'] == true    表示 地理位置授权
        if (res.authSetting['scope.userLocation'] != undefined && res.authSetting['scope.userLocation'] != true) {
          wx.showModal({
            title: '请求授权当前位置',
            content: '需要获取您的地理位置,请确认授权',
            success: function (res) {
              if (res.cancel) {
                wx.showToast({
                  title: '拒绝授权',
                  icon: 'none',
                  duration: 1000
                })
              } else if (res.confirm) {
                wx.openSetting({
                  success: function (dataAu) {
                    if (dataAu.authSetting["scope.userLocation"] == true) {
                      wx.showToast({
                        title: '授权成功',
                        icon: 'success',
                        duration: 1000
                      })
                      //再次授权,调用wx.getLocation的API
                      vm.getLocation();
                    } else {
                      wx.showToast({
                        title: '授权失败',
                        icon: 'none',
                        duration: 1000
                      })
                    }
                  }
                })
              }
            }
          })
        } else if (res.authSetting['scope.userLocation'] == undefined) {
          //调用wx.getLocation的API
          vm.getLocation();
        }
        else {
          //调用wx.getLocation的API
          vm.getLocation();
        }
      }
    })
  },
  // 微信获得经纬度
  getLocation: function () {
    let vm = this;
    wx.getLocation({
      type: 'wgs84',
      success: function (res) {
        console.log(JSON.stringify(res))
        var latitude = res.latitude
        var longitude = res.longitude
        var speed = res.speed
        var accuracy = res.accuracy;
        vm.getLocal(latitude, longitude)
      },
      fail: function (res) {
        console.log('fail' + JSON.stringify(res))
      }
    })
  },
  // 获取当前地理位置
  getLocal: function (latitude, longitude) {
    let vm = this;
    qqmapsdk.reverseGeocoder({
      location: {
        latitude: latitude,
        longitude: longitude
      },
      success: function (res) {
        console.log(JSON.stringify(res));
        let province = res.result.ad_info.province
        let city = res.result.ad_info.city
        vm.setData({
          province: province,
          city: city,
          latitude: latitude,
          longitude: longitude
        })

      },
      fail: function (res) {
        console.log(res);
      },
      complete: function (res) {
        // console.log(res);
      }
    });
  }
})

页面展示部分的代码

<!--index.wxml-->
<view class="retailStore">
   <view class="cnaps  borderBottom">
    <text>所在城市</text>
    <input class='m-bbt' placeholder-class='plhStyle' type='number' maxlength='50' placeholder='' bindinput="bindKeyInput" value='{{province}} {{city}}' disabled></input>
  </view>
</view>


2017-11-06 15:09:10 qq_35713752 阅读数 2547
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

 有问题可以扫码加我微信,有偿解决问题。承接小程序开发。

微信小程序开发交流qq群   173683895  、 526474645 ;

正文:

// 获取用户当前位置的名称和城市 util.js

function location() {
  // 实例化腾讯位置服务里面微信小程序JS SDK的API核心类 地址http://lbs.qq.com/qqmap_wx_jssdk/qqmapwx.html
  var qqmapsdk = new qqmap({
    key: '开发密钥(key
  });
  return new Promise((resolve) => {
    wx.getLocation({
      type: 'wgs84',
      success: function(res) {
        qqmapsdk.reverseGeocoder({
          location: {
            latitude: res.latitude,
            longitude: res.longitude
          },
          success: function(res) {
            const address = res.result.address
            resolve(address)
          },
          fail() {
            resolve('')
          }
        })
      }
    })
  })
}

module.exports = {
  location: location

}

//index.js

const util = require("../../utils/util.js")

onLoad: function () {

    util.location().then(function (data) {

        console.log(data)

    })

}

 

 

2014-12-12 10:39:03 wangbiao007 阅读数 5731
  • 微信支付开发-微信公众号开发12-微信开发php

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

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

     最近公司做一个活动,通过微信分享,要获取用户信息,这里涉及到微信的几个接口,顺便查了一些资料,这里记录一下微信公众账号获取用户信息的一些流程和用到的接口所需要的一些参数的含义。

    微信公众平台获取用户信息的基本原理:

    如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当前用户基本信息(包括昵称、性别、城市、国家)。利用用户信息,可以实现体验优化、用户来源统计、帐号绑定、用户身份鉴权等功能。请注意,“获取用户基本信息接口是在用户和公众号产生消息交互时,才能根据用户OpenID获取用户基本信息,而网页授权的方式获取用户基本信息,则无需消息交互,只是用户进入到公众号的网页,就可弹出请求用户授权的界面,用户授权后,就可获得其基本信息(此过程甚至不需要用户已经关注公众号。)”。

  1. 引导用户进入授权页面同意授权,获取code
  2. 通过code换取网页授权access_token(与基础支持中的access_token不同)
  3. 如果需要,开发者可以刷新网页授权access_token,避免过期
  4. 通过网页授权access_token和openid获取用户基本信息

第一步:用户同意授权,获取code,code在这里可以理解为你在获取用户信息之前必须获得的一个钥匙,拥有了他,你才能通过其他接口获取你想要的信息。

获取code的接口:
                            
参考链接(请在微信客户端中打开此链接体验)
Scope为snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=http%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对链接进行处理 比如是在朋友圈分享的一个活动链接,这个参数的值就是那个活动的url地址
response_type返回类型,请填写code
scope应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
state重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值
#wechat_redirect无论直接打开还是做页面302重定向时候,必须带此参数

下图为scope等于snsapi_userinfo时的授权页面:

网页授权

用户同意授权后

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE

code说明 :
code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

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

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

请求方法

获取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,

App Secret简称API接口密钥,是跟App Key配套使用的,可以简单理解成是密码 

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_inaccess_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拥有较长的有效期(7天、30天、60天、90天),当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_inaccess_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://wx.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正方形头像),用户没有头像时该项为空
privilege用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)
unionid只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。详见:获取用户个人信息(UnionID机制)


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

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


下面是获取用户信息的部分源码:
第一步应该是获取code,我这里没有源码,但前面已经给出接口了。

public ModelAndView getWeixinInfo(HttpServletRequest request,HttpServletResponse response)
	{
		ModelAndView mv=new ModelAndView("/activity/template/weixin_test.jsp");
		String code=request.getParameter("code");
		//公众账号的id,相当于用户名
		String appid="qq123456";
		//在申请公共账号时,微信平台给的一个相当于密码
		String appsecret="da154d5a4d5asd5ad4";
		String res1="",res2="",url1="",url2="";
		String access_token="";
		String openid="";
		url1="https://api.weixin.qq.com/sns/oauth2/access_token?appid="+appid+"&secret="+appsecret+"&code="+code+"&grant_type=authorization_code";
		res1=StringUtil.getUrlTxtWithCharSet(url1,"GBK");
		
		JSONObject object=null;
		try {
			object = new JSONObject(res1);
			access_token=object.get("access_token").toString();
			openid=object.getString("openid").toString();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		url2="https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"&lang=zh_CN";
		res2=StringUtil.getUrlTxtWithCharSet("https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"&lang=zh_CN","utf-8",3000,3000);
		JSONObject userInfo=null;
		try {
			//获取用户信息
			userInfo = new JSONObject(res2);
			openid=userInfo.get("openid ").toString();
			String nickname=userInfo.getString("nickname ").toString();
			String sex =userInfo.getString("sex").toString();
			String city =userInfo.getString("city").toString();
			String headimgurl  =userInfo.getString("headimgurl").toString();
			
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		request.setAttribute("res1", res1);
		request.setAttribute("res2", res2);
		request.setAttribute("url1",url1 );
		request.setAttribute("url2",url2 );
		request.setAttribute("access_token",access_token );
		request.setAttribute("openid", openid);
		return mv;
	}


     
getUrlTxtWithCharSet方法:
       <pre name="code" class="java">public static String  getUrlTxtWithCharSet(String strurl,String CharSet) {
		return getUrlTxtWithCharSet(strurl, CharSet, 0, 0);
	}
	
	public static String  getUrlTxtWithCharSet(String strurl,String CharSet,int connDelay,int readDelay) {
		StringBuffer sb=new StringBuffer();
		BufferedReader reader=null;
		String line=null;
		String result = "";
		String contentType = "";
		System.out.println("request:"+strurl);
		try {
			URL url=new URL(strurl);
			HttpURLConnection connection=(HttpURLConnection)url.openConnection();
			if(connDelay!=0&&readDelay!=0)
			{
				connection.setConnectTimeout(connDelay);
				connection.setReadTimeout(readDelay);
			}
//			connection.setRequestMethod("GET");
//			connection.setDoOutput(true);
//			connection.setDoInput(true);
//			OutputStream os = connection.getOutputStream();
			reader=new BufferedReader(new InputStreamReader(connection.getInputStream(),CharSet));		
			while ((line=reader.readLine())!=null) {
				sb.append(line);
			}
			result = sb.toString();
			contentType = connection.getContentType();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			MailUtil.sendGetUrlTxtExceptionMail(e, strurl, result);
		}
		try{
			contentType = ((contentType==null)?"":contentType);
			if(!StringUtil.isNullStr(result) && contentType.contains("text/xml")){
				//检查xml是否正确,不正确则发邮件
//				DocumentHelper.parseText(result);
				SAXBuilder builder = new SAXBuilder();
				builder.build(new StringReader(result));
			}
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			MailUtil.sendGetUrlTxtExceptionMail(null, strurl, result);
		}
		finally{
			try {
				reader.close();
			} catch (Exception e2) {
				// TODO: handle exception
				e2.printStackTrace();
			}
		}
		return result;
		
	}


    这部分源码少了获取code的那一步。
    本来想写点自己的见解的,谁知写起来后都是复制粘贴的,觉得有点失败,感觉还是没有研究透彻,没有成为自己的东西,如果你看到这篇文章,觉得对自己有帮助,我就非常高兴了。


微信开发

阅读数 36

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