1. 程式人生 > >微信小程式-獲取使用者資訊-後端寫法

微信小程式-獲取使用者資訊-後端寫法

之前介紹了兩種小程式獲取使用者資訊的寫法,其中第二種需要後端配合完成。

後端我使用了一個第三方的 jar 包:

我使用的是 2.9.6.BETA 版本。

這個版本提供了通過微信引數解析使用者資訊的方法,只要在配置檔案中把微信小程式的資訊配置完成就可以直接使用,非常方便。

直接看後臺獲取使用者資訊和生成第三方token 的方法,這裡的生成方式是直接使用 java 自帶的方法:

@Autowired
private RedisUtil redisUtil;
	
@Autowired
private WxMaService wxService;

@RequestMapping(value = "/login_status", method = RequestMethod.GET)
	public String getLoginStatus(@RequestParam(value = "code") String code,
			@RequestParam(value = "signature") String signature, 
			@RequestParam(value = "rawData") String rawData, 
			@RequestParam(value = "encryptedData") String encryptedData, 
			@RequestParam(value = "iv") String iv) throws WxErrorException {
		if(StringUtils.isEmpty(code)) {
			return "無效的code";
		}else {
			//存在有效的 code
			System.out.println("這裡請求了一次code==========" + code);
			WxMaJscode2SessionResult session = this.wxService.getUserService().getSessionInfo(code);
			String sessionKey = session.getSessionKey();
			//通過openId sessionKey 生成3rd session 返回給客戶端小程式
			String accessToken = UUID.randomUUID().toString();			
			// 使用者資訊校驗
	        if (!this.wxService.getUserService().checkUserInfo(sessionKey, rawData, signature)) {
	        	return "使用者資訊校驗失敗";
	        }
	     // 解密使用者資訊
	        WxMaUserInfo userInfo = this.wxService.getUserService().getUserInfo(sessionKey, encryptedData, iv);
	        System.out.println(userInfo);
	        System.out.println("accessToken : " + accessToken);
	        redisUtil.set("asdfKevin", accessToken, 180L);
	        return accessToken;
		}

 

其中的 wxService 是上述 jar 自帶的內容,redisUtil 是我自己封裝的 redis 的讀取工具類,比較簡單就不說了。

程式碼邏輯非常簡單,直接看就能看懂,最後 token 存到了 redis 中,備用。

另外 wxService 需要的兩個配置類,程式碼如下:


import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.springframework.boot.context.properties.ConfigurationProperties;

import lombok.Data;


@ConfigurationProperties(prefix = "wechat.miniapp")
@Data
public class WxMaProperties {

    private String appid;
    private String secret;
    private String token;
    private String aesKey;
    private String msgDataFormat;



    @Override
    public String toString() {
        return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
    }
}

 


import javax.servlet.Filter;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.kevin.crystal.filter.KevinTokenFilter;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.config.WxMaConfig;
import cn.binarywang.wx.miniapp.config.WxMaInMemoryConfig;

@Configuration
@ConditionalOnClass(WxMaService.class)
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {

    @Autowired
    private WxMaProperties properties;

    @Bean
    @ConditionalOnMissingBean
    public WxMaConfig config() {
        WxMaInMemoryConfig config = new WxMaInMemoryConfig();
        config.setAppid(this.properties.getAppid());
        config.setSecret(this.properties.getSecret());
        config.setMsgDataFormat(this.properties.getMsgDataFormat());

        return config;
    }

    @Bean
    @ConditionalOnMissingBean
    public WxMaService wxMaService(WxMaConfig config) {
        WxMaService service = new WxMaServiceImpl();
        service.setWxMaConfig(config);
        return service;
    }

    @Bean
    public Filter kevinTokenFilter() {
    	System.out.println("----------------test token filter-----------------");
    	return new KevinTokenFilter();
    }

    @Bean
    public FilterRegistrationBean tokenFilter() {
    	FilterRegistrationBean registration = new FilterRegistrationBean();
    	registration.setFilter(kevinTokenFilter());
    	registration.addUrlPatterns("/api/*");
//    	registration.addInitParameter("", "");
    	registration.setName("tokenFilter");
    	
    	return registration;
    }
}

 

其中java 程式碼中讀取的配置檔案需要正確配置小程式的 app id 和 app secret 。至此,後臺獲取微信使用者的資訊的方法就介紹完了。

如果你是原始碼複製,發現一個東西 KevinTokenFilter,聰明的你一猜就知道,這個就是我之前提到的過濾小程式後續請求中是否存在自定義token 的方法啦。下一篇介紹使用 filter 過濾請求頭的一種實現方法。