miniapp调用微信接口

miniapp调用微信接口

进行配置
wx:
  miniapp:
    config:
      appid: 
      secret: 
#      token: 
#      aeskey: 
      msgDataFormat: JSON
    #服务商小程序码跳转基础组件路径
    qr-base-page: 
    #收款码小程序外部扫描匹配链接
    qr-receipt-url: 
    #付款码小程序外部扫描匹配链接
    qr-pay-url: 
进行bean配置读取
@ConfigurationProperties(prefix = "wx.miniapp.config")
public class WxMaProperties {

    /**
     * 设置微信小程序的appid
     */
    private String appid;

    /**
     * 设置微信小程序的Secret
     */
    private String secret;

    /**
     * 消息格式,XML或者JSON
     */
    private String msgDataFormat = "JSON";
}
生成配置bean
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {

    @Bean
    public WxMaService wxMaService(WxMaProperties properties) {
        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
        config.setAppid(properties.getAppid());
        config.setSecret(properties.getSecret());
        config.setMsgDataFormat(properties.getMsgDataFormat());
        WxMaService service = new WxMaServiceImpl();
        service.setWxMaConfig(config);
        return service;
    }

}
具体实现层
/**
 * @author DCZhang
 * @title WxMpService
 * @date 2023/4/17 16:18
 * @description 小程序登录接口
 */
@Service
public class UserWxMpService {

    @Value("${wx.miniapp.qr-base-page}")
    private String qrBasePage; //微信小程序码页面基础路径配置

    @Autowired
    private WxMaService wxMaService;

    @Autowired
    private BusinessUserService businessUserService;

    @Resource
    private RedisUtil redisUtil;//redis工具类

    @Resource
    private WeChatMiniQRUtil weChatMiniQRUtil;//小程序码工具类

    /**
     * 小程序登录接口
     *
     * @return
     */
    public BusinessUserVO login(WxLoginDTO wxLoginDTO) {
        BusinessUserVO businessUserVO = null;
        // 使用自定义登录态绑定用户信息,并保存到数据库
        BusinessUser localInfo = getAndCreateLocalInfo(wxLoginDTO);
        businessUserVO = BusinessUserConvert.INSTANCE.toConvertBusinessUserVO(localInfo);
        // 查询用户是否存在
        BusinessUser selectUser = businessUserService.getUserByOpenid(localInfo.getOpenId());
        if (selectUser == null) {
            // 进行新手指引
            businessUserVO.setFirstLogin(true);
            businessUserService.createBankUser(localInfo);
        } else {
            // 已经登陆过的,更新token
            businessUserVO.setFirstLogin(false);
            businessUserService.updateUserInfo(selectUser.setToken(localInfo.getToken()));
        }
        return businessUserVO;
    }

    /**
     * 小程序注销接口
     *
     * @return
     */
    public void loginOut(String token) {
        // 查询用户是否存在
        BusinessUser selectUser = businessUserService.getUserByToken(token);
        if (selectUser != null) {
            businessUserService.updateUserInfo(selectUser.setToken(null));
        }
    }

    /**
     * vx官方转本地实体
     *
     * @return
     */
    private BusinessUser getAndCreateLocalInfo(WxLoginDTO wxLoginDTO) {
        // 调用 weixin-java-miniapp API 完成登录验证,获取用户信息
        WxMaJscode2SessionResult sessionResult = null;
        sessionResult = getWxMaJsCode2Session(wxLoginDTO.getCode());
        String sessionKey = sessionResult.getSessionKey();
        WxMaUserInfo userInfo = wxMaService.getUserService().getUserInfo(sessionKey, wxLoginDTO.getEncryptedData(), wxLoginDTO.getIv());
        String phone = this.getPhoneByCode(wxLoginDTO.getPhoneNumCode());
        BusinessUser localUser = createLocalUser(sessionResult.getOpenid(), userInfo, phone);
        return localUser;
    }

    /**
     * 获取微信用户session key (校验用户是否登录微信)
     *
     * @param code
     * @return
     */
    private WxMaJscode2SessionResult getWxMaJsCode2Session(String code) {
        WxMaUserService wxMaUserService = wxMaService.getUserService();
        WxMaJscode2SessionResult sessionResult;
        try {
            sessionResult = wxMaUserService.getSessionInfo(code);
        } catch (WxErrorException e) {
            throw new BizException("获取微信用户sessionKey信息失败");
        }
        return sessionResult;
    }

    /**
     * 创建本地用户,创建自定义登录态
     *
     * @param openid
     * @param userInfo
     */
    private BusinessUser createLocalUser(String openid, WxMaUserInfo userInfo, String phone) {
        BusinessUser businessUser = new BusinessUser();
        businessUser.setOpenId(openid);
        // 生成自定义登录态
        String token = generateToken(openid);
        businessUser.setToken(token);
        businessUser.setNickName(userInfo.getNickName());
        businessUser.setHeadImage(userInfo.getAvatarUrl());
        businessUser.setUnionId(userInfo.getUnionId());
        businessUser.setPhone(phone);
        return businessUser;
    }

    /**
     * 根据自定义登录态获取用户信息
     *
     * @param token
     * @return
     */
    public BusinessUserVO getUserInfo(String code, String token) {
        // 调用微信api校验用户是否登录微信
        getWxMaJsCode2Session(code);
        // 使用自定义登录态获取用户信息
        BusinessUser user = businessUserService.getUserByToken(token);
        if (user == null) {
            throw new BizException("invalid token");
        }
        // 返回用户信息
        BusinessUserVO businessUserVO = new BusinessUserVO();
        businessUserVO.setOpenId(user.getOpenId());
        businessUserVO.setNickName(user.getNickName());
        businessUserVO.setHeadImage(user.getHeadImage());
        return businessUserVO;
    }


    // 生成自定义登录态
    private String generateToken(String openid) {
        String key = "my_secret_key";
        long currentTimeMillis = System.currentTimeMillis();
        String token = openid + ":" + currentTimeMillis;
        String signature = DigestUtils.sha1Hex(token + ":" + key);
        return token + ":" + signature;
    }

    /**
     * 获取access_token
     *
     * @return access_token
     * @date 2023/4/26 09:10
     */
    public String getAccessToken() {
        String token = redisUtil.getCacheObject(WxConstant.WX_APP_ACCESS_TOKEN);
        if (StringUtils.isEmpty(token)) {
            return this.refreshAccessToken().get();
        }
        return token;
    }

    /**
     * 刷新access_token
     *
     * @return access_token
     * @date 2023/4/26 09:10
     */
    private Optional<String> refreshAccessToken() {
        try {
            String accessToken = wxMaService.getAccessToken();
            // 凭证有效时间 60*90(秒)1.5(小时)
            int exp = 5400;
            redisUtil.setCacheObject(WxConstant.WX_APP_ACCESS_TOKEN, accessToken, exp, TimeUnit.SECONDS);
            return Optional.of(accessToken);
        } catch (Exception e) {
            return Optional.empty();
        }
    }


    /**
     * 根据服务商id生成小程序码
     *
     * @param serviceProviderId 服务商id
     * @return base64格式的图片
     * @throws Exception
     * @date 2023/4/26 14:58
     */
    public String getMiniQRByServiceProviderId(Long serviceProviderId) throws Exception {
        String pagePath = this.qrBasePage;
        if (serviceProviderId != null) {
            pagePath = pagePath + "?" + "id=" + serviceProviderId;
        }
        return weChatMiniQRUtil.getBase64MiniQR(pagePath, getAccessToken());
    }


    /**
     * 根据电话code获取电话
     *
     * @param phoneNumCode 不是登录时候的code,是电话获取按钮返回的code
     * @return 电话号码
     * @date 2023/4/26 15:58
     */
    public String getPhoneByCode(String phoneNumCode) {
        try {
            WxMaPhoneNumberInfo newPhoneNoInfo = wxMaService.getUserService().getNewPhoneNoInfo(phoneNumCode);
            return newPhoneNoInfo.getPhoneNumber();
        } catch (WxErrorException e) {
            throw new BizException("获取电话失败");
        }
    }

}
项目导入maven
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-miniapp</artifactId>
        </dependency>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值