SpringBoot微信小程序授权登录

一、appId

1.1、自己是管理者:微信公众平台,申请或登录自己的微信小程序,在开发者管理中即可看到
2.2、自己是开发者:让管理员将自己加入到小程序开发者管理中,用管理者提供的appId和secret,否则没有开发权限

二、小程序登录页面

2.1、打开HBuilderX开发工具,新建一个uni-app项目

2.2、在项目根目录下新建config文件夹,创建config.js文件,配置后台访问路径

// 配置后台服务器访问地址:ip:端口/项目名
const hostUrl = ''
export default {// 本地持久化存储keyprojectKey: 'XinJiangBS',// api请求地址// #ifdef H5// H5 环境,配合menifest.json中的devServe配置来解决调试时的跨域问题baseUrl: process.env.NODE_ENV === 'development' ? '/dev' : hostUrl,// #endifbaseUrl: hostUrl,// 盐kSalt: 'XDSAKDSALMSD',
}

2.3、新建简单的login.vue页面,调用前端方法获取后台登录需要用的code信息

<button @click="toLogin">获取登录code</button>
// 可以将后台接口统一写在common.js中,页面统一引入
import { } from "@/api/common.js"
methods:{toLogin(){uni.getProvider({service:'oauth',success:(provider) => {uni.login({success:(loginCode) =>{console.log("loginCode",loginCode);// todo 调用后台登录接口,参数code}})}})},
}

2.4、下载微信开发者工具,并安装

2.5、配置HBuilderX,点击manifest.json,再点击微信小程序配置appid

2.6、配置运行小程序需要用到的微信开发开发者工具,点击HBuilder上面工具栏中的:工具—设置—运行配置,找到微信开发者工具工具路径,配置2.4中安装安装时的路径

三、java代码部分

1.新建微信小程序公用配置文件

@Component
@Slf4j
public class WxDataConfigure {/**小程序appId*/public static String appId = "";/**小程序的秘钥*/public static String ** = "";/**商户号*/public static String mch_id = "";/**商户支付秘钥V2*/public static String key = "";/**商户支付秘钥V3*/public static String keyV3 = "";/**退款用到*/public static String certUrl = "";/**商家转账到零钱*/public static String pemUrl = "";public static String privateKeyPath = "";public static String privateCertPath = "";public static String sn = "";/**商户证书序列号*/public static String serial_no = "";/**回调通知地址(需内网穿透测试)*/public static String notify_url = "";/**交易类型*/public static  String trade_type = "JSAPI";/**统一下单API接口链接*/public static String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";/**查询订单API接口链接*/public static String query_url = "https://api.mch.weixin.qq.com/pay/orderquery";/**退款接口*/public static String refund_url = "https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";/**退款回调接口*/public static String refund_notify_url = "";/**商家转账到零钱*/public static String batches_url = "https://api.mch.weixin.qq.com/v3/transfer/batches";/*** 预支付* @return*/public static WxPayService unifiedOrderWxPayService() {log.info("======================初始化微信支付接口服务开始======================");WxPayConfig payConfig = new WxPayConfig();payConfig.setAppId(appId);payConfig.setMchId(mch_id);payConfig.setMchKey(key);payConfig.setKeyPath(certUrl);payConfig.setTradeType(trade_type);WxPayService wxPayService = new WxPayServiceImpl();wxPayService.setConfig(payConfig);log.info("======================初始化微信支付接口服务完成======================");return wxPayService;}/*** 退款* @return*/public static WxPayService wxPayService() {//logger.info("======================初始化微信支付接口服务开始======================");WxPayConfig payConfig = new WxPayConfig();payConfig.setAppId(appId);payConfig.setMchId(mch_id);payConfig.setPrivateKeyPath(privateKeyPath);payConfig.setNotifyUrl(refund_notify_url);payConfig.setApiV3Key(keyV3);payConfig.setPrivateCertPath(privateCertPath);payConfig.setCertSerialNo(serial_no);payConfig.setMchKey(key);payConfig.setKeyPath(certUrl);payConfig.setTradeType(trade_type);WxPayService wxPayService = new WxPayServiceImpl();wxPayService.setConfig(payConfig);//logger.info("======================初始化微信支付接口服务完成======================");return wxPayService;}

2.调用微信服务器接口的请求方法类

public class HttpRequest {//连接超时时间,默认10秒private static final int socketTimeout = 10000;//传输超时时间,默认30秒private static final int connectTimeout = 30000;/*** 向指定URL发送GET方法的请求** @param url   发送请求的URL* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。* @return URL 所代表远程资源的响应结果*/public static String sendGet(String url, String param) {String result = "";BufferedReader in = null;try {String urlNameString = url + "?" + param;URL realUrl = new URL(urlNameString);// 打开和URL之间的连接URLConnection connection = realUrl.openConnection();// 设置通用的请求属性connection.setRequestProperty("accept", "*/*");connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 建立实际的连接connection.connect();// 获取所有响应头字段Map<String, List<String>> map = connection.getHeaderFields();// 遍历所有的响应头字段for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}// 定义 BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(connection.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送GET请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输入流finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}/*** post请求** @throws IOException* @throws ClientProtocolException* @throws NoSuchAlgorithmException* @throws KeyStoreException* @throws KeyManagementException* @throws UnrecoverableKeyException*/public static String sendPost(String url, Object xmlObj) throws ClientProtocolException, IOException, UnrecoverableKeyException, KeyManagementException, KeyStoreException, NoSuchAlgorithmException {HttpPost httpPost = new HttpPost(url);//解决XStream对出现双下划线的bugXStream xStreamForRequestPostData = new XStream(new DomDriver("UTF-8", new XmlFriendlyNameCoder("-_", "_")));xStreamForRequestPostData.alias("xml", xmlObj.getClass());//将要提交给API的数据对象转换成XML格式数据Post给APIString postDataXML = xStreamForRequestPostData.toXML(xmlObj);System.out.println(postDataXML);//得指明使用UTF-8编码,否则到API服务器XML的中文不能被成功识别StringEntity postEntity = new StringEntity(postDataXML, "UTF-8");httpPost.addHeader("Content-Type", "text/xml");httpPost.setEntity(postEntity);//设置请求器的配置RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(socketTimeout).setConnectTimeout(connectTimeout).build();httpPost.setConfig(requestConfig);HttpClient httpClient = HttpClients.createDefault();HttpResponse response = httpClient.execute(httpPost);HttpEntity entity = response.getEntity();String result = EntityUtils.toString(entity, "UTF-8");return result;}/*** http POST 请求** @param url:请求地址* @param body:     body实体字符串* @param certPath: 证书路径* @param password: 证书密码* @return*/public static String httpPostReflect(String url, String body, InputStream certPath, String password) {String xmlRes = "{}";HttpClient client = createSSLClientCert(certPath, password);HttpPost httpost = new HttpPost(url);try {//所有请求的body都需采用UTF-8编码
//            StringEntity entity = new StringEntity(body,"UTF-8");
//            httpost.setEntity(entity);//支付平台所有的API仅支持JSON格式的请求调用,HTTP请求头Content-Type设为application/jsonhttpost.addHeader("Connection", "keep-alive");httpost.addHeader("Accept", "*/*");httpost.addHeader("Content-Type", "application/json; charset=UTF-8");httpost.addHeader("Host", "api.mch.weixin.qq.com");httpost.addHeader("X-Requested-With", "XMLHttpRequest");httpost.addHeader("Cache-Control", "max-age=0");httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");//httpost.addHeader("Authorization",Configure.sn + " " + data);httpost.setEntity(new StringEntity(body, "UTF-8"));HttpResponse response = client.execute(httpost);//所有响应也采用UTF-8编码String result = EntityUtils.toString(response.getEntity(), "UTF-8");xmlRes = result;} catch (ClientProtocolException e) {System.out.println(e);} catch (UnknownHostException e) {System.out.println(e);} catch (IOException e) {System.out.println(e);}return xmlRes;}/*** 创建带证书的实例** @param certPath* @return*/public static CloseableHttpClient createSSLClientCert(InputStream certPath, String password) {try {KeyStore keyStore = KeyStore.getInstance("PKCS12");keyStore.load(certPath, password.toCharArray());certPath.close();SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {//信任所有public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {return true;}}).loadKeyMaterial(keyStore, password.toCharArray()).build();SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[]{"TLSv1", "TLSv1.2"}, null, SSLConnectionSocketFactory.getDefaultHostnameVerifier());return HttpClients.custom().setSSLSocketFactory(sslsf).build();} catch (KeyManagementException e) {System.out.println(e);} catch (NoSuchAlgorithmException e) {System.out.println(e);} catch (KeyStoreException e) {System.out.println(e);} catch (FileNotFoundException e) {System.out.println(e);} catch (Exception e) {System.out.println(e);}return HttpClients.createDefault();}/*** 自定义证书管理器,信任所有证书** @author pc*/public static class MyX509TrustManager implements X509TrustManager {@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] arg0, String arg1)throws CertificateException {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] arg0, String arg1)throws CertificateException {}@Overridepublic java.security.cert.X509Certificate[] getAcceptedIssuers() {return null;}}
}

3.微信登录方法,返回用户信息至前端

@Slf4j
@RestController
@RequestMapping("/wx/user")
public class WxController {/***  //GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code*  //https://api.weixin.qq.com/sns/jscode2session*/@GetMapping("/wxLogin")public Map<String,String> wxLogin(@RequestParam(name = "code",required = true) String code){//小程序登录参数Get请求String openidParams = "appid=" + WxDataConfigure.appId + "&secret=" + WxDataConfigure.secret + "&js_code=" + code + "&grant_type=" + "authorization_code";String openidUrl = "https://api.weixin.qq.com/sns/jscode2session";//获取接口调用凭证参数Get请求String accessTokenParams = "appid=" + WxDataConfigure.appId + "&secret=" + WxDataConfigure.secret + "&grant_type=" + "client_credential";String accessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token";//http请求微信服务器String openIdResult = HttpRequest.sendGet(openidUrl, openidParams);String accessTokenResult = HttpRequest.sendGet(accessTokenUrl, accessTokenParams);JSONObject openIdJson = JSONObject.parseObject(openIdResult);JSONObject accessTokenJson = JSONObject.parseObject(accessTokenResult);//获取openIdString openid =(String) openIdJson.get("openid");//会话秘钥String session_key =(String) openIdJson.get("session_key");//获取到的凭证String access_token =(String) accessTokenJson.get("access_token");Integer expiresIn =(Integer) accessTokenJson.get("expires_in");Map<String, String> infoMap = new HashMap<>();infoMap.put("openid",openid);infoMap.put("session_key",session_key);infoMap.put("access_token",access_token);infoMap.put("expiresIn",expiresIn.toString());return infoMap;}
}

一个在学习的开发者,勿喷,欢迎交流

SpringBoot微信小程序授权登录相关推荐

  1. java springboot微信小程序授权登录

    开发前提,注册小程序获取appid和secret 小程序端添加授权按钮 <button class="weui-btn" type="primary" b ...

  2. 基于Uniapp+SpringBoot实现微信小程序授权登录

    手把手教你做微信小程序授权登录交互 一.uni.login请求临时code 二.uni.request向后台交换数据 三.源代码 前台:在GetUserInfo中添加接口 后台:SpringBoot后 ...

  3. 微信小程序授权登录 组件的封装

    微信小程序授权登录 组件的封装 新建components文件 写wxml文件 wxss部分 js部分 json引用 页面使用 页面js 授权登录 流程如下: 因为多个页面功能需要登录状态 所以做了个组 ...

  4. uniapp微信小程序授权登录和获取微信绑定的手机号码

    uniapp微信小程序授权登录和获取微信绑定的手机号码 弹出授权的弹框 <view class="weixinOk" @tap="getUserProfile&qu ...

  5. 微信小程序授权登录取消授权重新授权处理方法 附可用代码

    微信小程序授权登录基本是小程序的标配了,但是官方的demo,取消授权后,就不能再重新点击登录,除非重新加载小程序才可以,这下怎么办? 我们可以先在首页引导用户点击,然后跳转到一个新的页面,在新的页面进 ...

  6. 新版微信小程序授权登录流程及问题汇总(getUserProfile)

    问题来源:前不久去面试的时候有面试官问我你有自己的博客啥的吗?只能很尴尬的说没有.其实一直想有一个属于自己的博客啥的去记录自己在开发过程中遇到的问题,正好现在微信小程序比较流行,就花了两天自己搞了一个 ...

  7. SpringCloud 微信小程序授权登录 获取openId SessionKey【SpringCloud系列13】

    SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见. 自我提升方法推荐:神奇的早起 早上 5:00 -5:20 起床刷牙 5:30-6:00 晨练(跑步.跳绳.骑自行车.打球等等) ...

  8. 微信小程序授权登录第一次总是失败,第二次登录便正常了

    微信小程序授权登录第一次总是失败,第二次登录便正常了 错误流程 调用 用户点击授权用户信息按钮 ===> 调用wx.login( )生成code发送给后台生成session_key解密 ===& ...

  9. 微信小程序授权登录报错encryted_data或iv不合法,前端坑^-^~~

    微信小程序授权登录原来用的wx.getUserInfo(),在用户未授权过的情况下调用此接口,将不再出现授权弹窗, 会直接进入 fail 回调(详见<公告>).在用户已授权的情况下调用此接 ...

最新文章

  1. zookeeper搭建
  2. ARMS企业级场景被集成场景介绍
  3. opencv调试利器ImageWatch的安装使用
  4. 二分答案——H指数(Leetcode 274)
  5. 执行计算机查错程序,计算机 每次启动过程中总会执行磁盘检查CHKDSK,什么问题???怎么处理??...
  6. 时间的正则表达式验证
  7. python---之getattr
  8. bat代码雨代码流星_怎么制作无限弹窗效果? 限弹窗代码bat文件分享
  9. 给定两个水壶,一个可以装4升水,一个能装3升水,水壶上没有任何度量标记。有一水龙头可以用来往壶中灌水。问题是怎样在能装4升的水壶里面恰好只装2升水
  10. 服务器浏览器怎么打不开网页,电脑能上qq打不开网页怎么回事?
  11. Indilinx主控固态量产成功修复步骤
  12. 看病(版权所有翻版必究)
  13. 图像处理问题解决师——求取每个颗粒到其他颗粒边缘的最近距离
  14. TMS28027输出PWM波例程解析
  15. 当矩阵的秩小于未知数的个数时,方程组有无数个解;当矩阵的秩等于未知数的个数时,方程组只有零解。...
  16. Deep Face Recognition读书笔记
  17. emacs chinese manual
  18. 如何把JAR发布到maven中央仓库
  19. 如何识别手写文字python_如何快速使用Python神经网络识别手写字符?(文末福利)...
  20. 【链环科技】如何利用“私域流量”——小程序直播做到高转化低退货

热门文章

  1. 腾讯云轻量应用服务器如何创建并挂载云硬盘?
  2. 数据标准化——scikit-learn
  3. java 获取 海康 视频流_海康网络摄像机调用SDK解码Java版
  4. 163邮箱,163vip的邮箱收费标准是什么?
  5. 鼠标能动但是无法点击屏幕(间歇性)
  6. 创业前期怎么做个简单易行的计划?
  7. iOS 屏幕适配 iPhone X SafeArea安全区域
  8. 英语听说计算机查分,2019北京中考英语听说考怎么查分?附一键查询入口
  9. linux下启动tomcat----Cannot find ./catalina.sh
  10. VB.net写的音乐播放器,带百度翻译歌词