注意:部分功能依赖于第三方支付工具类:ijpay

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.parser.Feature;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipayEncrypt;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayOpenAppQrcodeCreateRequest;
import com.alipay.api.request.AlipaySystemOauthTokenRequest;
import com.alipay.api.response.AlipayOpenAppQrcodeCreateResponse;
import com.alipay.api.response.AlipaySystemOauthTokenResponse;
import com.ijpay.alipay.AliPayApi;
import com.ijpay.alipay.AliPayApiConfig;
import com.ijpay.alipay.AliPayApiConfigKit;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.constraints.NotEmpty;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.Map;/*** @author yz* @className AlipayLoginSvc* @description* @date 2020/7/31 9:56*/
@RequestMapping("/alipayLogin")
@Service
@Validated
public class AlipayLoginSvc {private final static Logger LOGGER = LoggerFactory.getLogger(AlipayLoginSvc.class);/*** 解密成功MSG*/private final static String DECRYPT_SUCCESS_MSG = "Success";@Autowiredprivate AliPayMiniAppConfig aliPayMiniAppConfig;/*** AES接口加密秘钥*/@NotEmpty@Value("${alipay.miniapp.aesEncryptKey}")private String miniAesEncryptKey;/*** @param oauthTokenRequest {@link AlipaySystemOauthTokenRequest}* @return {@link OutDTO<AlipaySystemOauthTokenResponse>}* @description 通过code换取授权访问令牌* @author yz* @date 2020/7/31 10:36*/public OutDTO<AlipaySystemOauthTokenResponse> codeToToken4Mini(@RequestBody AlipaySystemOauthTokenRequest oauthTokenRequest) {if (StringUtils.isAnyBlank(oauthTokenRequest.getCode(), oauthTokenRequest.getGrantType())) {return Response.invalid(null);}try {//设置支付配置AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayMiniAppConfig.getConfig());AlipaySystemOauthTokenResponse response = AliPayApi.certificateExecute(oauthTokenRequest);if (response.isSuccess()) {return Response.success(response);}} catch (AlipayApiException e) {LOGGER.error("支付宝code换取token授权失败!", e);}return Response.error("授权失败!", null);}/*** @param encryptedStrMap 加密字符串Map* @return {@link org.jservice.message.simplejson.dt.out.OutDTO<java.lang.String>}* @description 解密手机号* @author yz* @date 2020/8/1 10:50*/public OutDTO<String> decryptPhoneNo(@RequestBody Map<String, String> encryptedStrMap) {String encryptedStr = encryptedStrMap.get("encryptedStr");if (StringUtils.isBlank(encryptedStr)) {return Response.invalid();}AliPayApiConfig config;try {config = aliPayMiniAppConfig.getConfig();} catch (AlipayApiException e) {LOGGER.error("获取配置失败!", e);return Response.error("系统错误!");}try {String decryptStr = doDecrypt(encryptedStr, config);//转为mapMap decryptMap = JSON.parseObject(decryptStr, Map.class);if (DECRYPT_SUCCESS_MSG.equals(decryptMap.get("msg"))) {return Response.success((String) decryptMap.get("mobile"));} else {LOGGER.error("手机号获取失败!{}", decryptMap.get("msg"));return Response.error("手机号获取失败!");}} catch (Exception e) {return Response.error(e.getMessage());}}/*** @param encryptedStr 加密字符串* @param config       支付宝配置* @return {@link String}* @description 解密方法* @author yz* @date 2020/8/1 10:47*/private String doDecrypt(String encryptedStr, AliPayApiConfig config) throws Exception {//1. 获取验签和解密所需要的参数Map<String, String> openapiResult = JSON.parseObject(encryptedStr, new TypeReference<Map<String, String>>() {},Feature.OrderedField);String content = openapiResult.get("response");String sign = openapiResult.get("sign");//2.判断报文是否加密//若报文没有加密,则 response 的值为 json,而加密情况 response 是 Base64 字符串。//所以可以通过 response 的值是否是括号符开头:”{“来进行判断 。boolean isDataEncrypted = !content.startsWith("{");//3.验签boolean signCheckPass;String signContent = isDataEncrypted ? "\"" + content + "\"" : content;//如果是加密的报文则需要在密文的前后添加双引号try {signCheckPass = AlipaySignature.rsaCertCheck(signContent, sign, config.getAliPayCertPath(), "UTF-8","RSA2");} catch (AlipayApiException e) {LOGGER.error("验签失败", e);throw new BusiException("验签失败!");}if (!signCheckPass) {//验签不通过(异常或者报文被篡改),终止流程(不需要做解密)throw new BusiException("验签失败!");}//4. 解密try {//未加密直接返回原内容,否则解密后返回return isDataEncrypted ? AlipayEncrypt.decryptContent(content, "AES", miniAesEncryptKey,config.getCharset()) : content;} catch (AlipayApiException e) {//解密异常, 记录日志LOGGER.error("解密异常", e);throw new BusiException("解密异常");}}/*** 生成支付宝小程序码** @author yz* @date 2020/8/4 9:25*/public OutDTO<String> getAlipayQrCode(@RequestBody Map<String,String> bizContentMap) throws AlipayApiException {AliPayApiConfigKit.setThreadLocalAliPayApiConfig(aliPayMiniAppConfig.getConfig());AlipayOpenAppQrcodeCreateRequest request = new AlipayOpenAppQrcodeCreateRequest();String bizContent = JSON.toJSONString(bizContentMap);request.setBizContent(bizContent);AlipayOpenAppQrcodeCreateResponse response = AliPayApi.certificateExecute(request);if(response.isSuccess()){return Response.success(response.getQrCodeUrl());} else {return Response.error("调用失败");}}
}

支付宝小程序获取手机号(证书方式解密)及生成小程序码代码示例相关推荐

  1. 支付宝小程序获取手机号和授权信息遇坑锦集

    准备条件 官方链接 仅对企业账户开放 配置接口加签方式 官方链接 注意:这里我强调一下,公钥和支付宝公钥是不一样的 公钥和私钥是使用工具成对生成的,并需要上传到管理后台 管理后台拿到公钥后会返回给你一 ...

  2. 好玩的接口 之 Java 解密微信小程序获取手机号

    LZ-Says:有些东西,真的是很矛盾,本来很简单的事儿,各自坚持,结果,不欢而散,不舍?如何? 前言 最近搞接口,基于 Spring Boot,怎么说呢,很虐. 不过熟悉了业务,表结构等等,相对来说 ...

  3. uni-app微信小程序获取手机号;微信小程序获取手机号,获取到后需要进行解密;微信小程序获取手机号失败 Error:该appId没有权限

    方法1.uni-app登录加获取手机号解密-直接看此篇即可解决 微信小程序获取手机号注意点: 1.需要先登录,微信小程序登录看这篇 2.手机号获取到时加密的,需要后端解密或者前端自己解密(解密时候就会 ...

  4. 微信小程序获取手机号并解密详解

    微信小程序获取手机号并解密 1 获取手机号 2 解密 2.1 获取所需数据 2.2 解密返回数据 1 获取手机号 获取手机号的过程官方文档有详细的介绍.参考官方链接 要注意的是,此功能只对非个人且完成 ...

  5. 微信小程序获取手机号流程及后端java解密

    在小程序开发中,获取微信用户绑定的手机号功能,详细可查看官方文档:微信官方文档 · 小程序 获取手机号 获取微信用户绑定的手机号,需先调用wx.login接口. 因为需要用户主动触发才能发起获取手机号 ...

  6. php7.4 微信小程序获取手机号

    第一步应该先接受获取code 然后得到sessionkey和openid 第二步 把openid返回给小程序客户端,同时把sessionkey和openid存入数据库 第三步 小程序获取手机号时把op ...

  7. 微信小程序获取手机号登录流程

    微信小程序获取手机号登录流程 首先前端使用wx.login 获取code wx.login({success(res) {if (res.code) {that.setData({code: res. ...

  8. 微信小程序获取手机号,含java后台接口实现

    前言 前面写了一篇 java实现微信小程序加密数据解密_女IT玩家-彬彬的博客-CSDN博客 然后接着写微信小程序如何获取手机号,本文既有小程序的实现代码.也有后台java的实现代码哦!! 小程序实现 ...

  9. 微信小程序获取手机号登录流程(个人开发者账号不支持)

    微信小程序获取手机号登录流程 所需条件 1. 非个人开发者账号 2. AppID+AppSecret 流程思路 **注意:** 代码实现 常见问题 所需条件 1. 非个人开发者账号 获取手机号文档 这 ...

  10. 微信小程序获取手机号组件或即将迎来升级及收费

    据知情人士透漏,继企业微信加好友数量需要收费后,小程序获取手机号组件""即将迎来升级并开启"收费"模式,具体上线时间以"官方公告"为准 以下 ...

最新文章

  1. [高数][高昆轮][高等数学上][第二章-导数与微分]01.导数的定义
  2. Win10開始菜单打不开
  3. java中javamail收发邮件实现方法
  4. 使用:focus-within实现下拉菜单效果
  5. Python高级特性: 12步轻松搞定Python装饰器
  6. 【渝粤教育】国家开放大学2018年秋季 2503T学前儿童健康教育 参考试题
  7. matlab控制realsense,RealSense开发学习--1.初识RealSense
  8. 海量 GPU 等你来,OpenMMLab 岗位全开!
  9. 用 CSS 实现元素垂直居中
  10. 二叉树的遍历 C/C++语言实现
  11. Javaweb - JSP章节 - MVC和三层架构案例总练习(下) - “回显数据”-“修改数据”功能实现
  12. 【MSFconsole进阶】auxiliary模块:信息收集、扫描、嗅探、指纹识别、口令猜测和Dos攻击等
  13. html5考试总结300字,期中考试总结作文300字合集五篇
  14. RK3288开发板——Debian8系统制作
  15. docker安装wechat微信、wxwork企业微信脚本整理
  16. java管理系统删除报错_Java版学籍管理系统
  17. 如何利用少数粉丝,实现短时间流量倍增?
  18. 3D MAX 安装中的一些问题 一直初始化、闪退
  19. vue项目首屏加载优化
  20. 使用GSAP的动画库为Bootstrap传送带制作动画

热门文章

  1. php 获取图片主色调,PHP获取图片主色调的方法介绍
  2. Linux安装mysql8.0.26版本
  3. 罗辑思维CEO李天田:我们是这样玩儿公司的
  4. mysql 死锁和死锁检测
  5. Java二进制及中文转码和校验
  6. jmeter 性能测试 --- 并发、负载、压力
  7. Mac如何安全地彻底卸载软件?
  8. 【每天学习一点新知识】关于五险一金你必须知道
  9. mdk 使用arm complier v6开启FPU报错问题
  10. dumpbin的使用方法_DUMPBIN命令使用详解