前言
因公司项目需要做微信小程序相关项目,故记录一下相关开发要点。 使用的是binarywang工具包,版本为4.1.0。 后端框架使用springboot 更多其他功能使用推荐查看https://github.com/binarywang/binarywang
一、需求描述:授权获取手机号码登录
用户授权手机号登录小程序。
二、具体操作
1.引入相关依赖
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.1.0</version>
</dependency>
2.步骤
通过code获取openid, sessionKey
获取手机号需要encryptedData(加密用户数据),iv(加密算法的初始向量),sessionKey(会话密钥)
3.相关代码
3.1 微信小程序开发的相关配置
在application.yml文件中配置
test:
wechat:
appid: 小程序的appid
appSecret: 小程序的appSecret
msgDataFormat: JSON
mchId: 商户号
mchKey:商户密钥
certPath: 证书路径
notify-url: 支付回调接口路径
3.2创建配置文件
代码如下(示例):
@Data
@ConfigurationProperties(prefix = "test.wechat")
public class WeChatProperties {
private String appId;
private String appSecret;
private String msgDataFormat;
private String mchId;
private String mchKey;
private String certPath;
}
备注:其中商户号、商户密钥、证书都是后续微信小程序支付需要使用到。
3.3 实例化WxMaService
@Configuration
@EnableConfigurationProperties(WeChatProperties.class)
public class WeChatMaConfig {
@Autowired
private WeChatProperties properties;
@Bean
public WxPayService wxPayService() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(StringUtils.trimToNull(properties.getAppId()));
payConfig.setMchId(StringUtils.trimToNull(properties.getMchId()));
payConfig.setMchKey(StringUtils.trimToNull(properties.getMchKey()));
payConfig.setKeyPath(StrUtil.format("classpath:{}", StrUtil.trim(properties.getCertPath())));
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(payConfig);
return wxPayService;
}
@Bean
public WxMaService initWxMaService() {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
config.setAppid(StrUtil.trim(properties.getAppId()));
config.setSecret(StrUtil.trim(properties.getAppSecret()));
config.setMsgDataFormat(StrUtil.trim(properties.getMsgDataFormat()));
WxMaService wxMaService = new WxMaServiceImpl();
wxMaService.setWxMaConfig(config);
return wxMaService;
}
}
3.4 手机号码授权登录
关键代码如下(示例):
@RestController
@Slf4j
public class TestContoller {
@Autowired
private WxMaService wxMaService;
@GetMapping("/login")
public void login(String code, String encryptedData, String iv) {
try {
WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);
String openid = sessionInfo.getOpenid();
log.info("openid:" + openid);
String sessionKey = sessionInfo.getSessionKey();
WxMaPhoneNumberInfo phoneInfo = wxMaService.getUserService().getPhoneNoInfo(sessionKey, encryptedData, iv);
String phone = phoneInfo.getPhoneNumber();
log.info("phone:" + phone);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
}
|