微信小程式-獲取使用者資訊-後端寫法
阿新 • • 發佈:2018-11-26
之前介紹了兩種小程式獲取使用者資訊的寫法,其中第二種需要後端配合完成。
後端我使用了一個第三方的 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 過濾請求頭的一種實現方法。