H5网页跳转微信小程序
获取scheme码
该接口用于获取小程序 scheme 码,适用于短信、邮件、外部网页、微信内等拉起小程序的业务场景。目前仅针对国内非个人主体的小程序开放,详见获取 URL scheme。
效果:https://www.youlingrc.com/minishare.html
项目地址:https://github.com/yusheng9/openwxchat
H5:index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>优领用工-我要招聘</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style type="text/css"> html, body { height: 100%; margin: 0; padding: 0; } .page { background: linear-gradient(to bottom, #28AC86 50%, #DBEAE7 50%); width: 100%; height: 100vh; overflow: hidden; position: relative; } .page .main{ background: url('https://img.youlingrc.com/images/20231018142538.png') no-repeat center; background-size: contain; width: 100%; height: 100vh; } .btn{ width: 80%; height: 60px; background: #28AC86; color: white; position: absolute; left: 10%; bottom: 8%; font-size: 2.1em; display: flex; align-items: center; justify-content: center; border-radius: 20px; box-shadow: 5px 6px 16px rgba(0, 0, 0, 0.3); } </style> </head> <body> <div class="page"> <div class="main"> <div class="btn">我要招聘</div> </div> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <script> $(function(){ let openlink = ''; $.ajax({ url: 'http://127.0.0.1:8080/wchat/api/generatescheme', type: 'POST', // 或者 'GET',根据您的需求 data: JSON.stringify({ path: "pages/home/home", query: "source=8" }), contentType: 'application/json', success: function (res) { // 请求成功时的处理逻辑 console.log('请求成功', res); if (res.code === "20000") { let data = res.content if (data.openlink){ openlink = data.openlink } } }, error: function (xhr, status, error) { // 请求失败时的处理逻辑 console.log('请求失败', status, error); } }); $(".btn").click(function () { // 检测用户代理字符串 var userAgent = navigator.userAgent; console.log('userAgent',userAgent) // 定义PC浏览器的关键词 var pcKeywords = ["Windows", "Macintosh"]; // 检查用户代理是否包含PC关键词 var isPC = pcKeywords.some(function (keyword) { return userAgent.indexOf(keyword) !== -1; }); // 如果是PC浏览器,显示提示消息 if (isPC) { alert("请使用手机浏览器打开。"); return } window.location.href = openlink }); }) </script> </body> </html>
java后端服务:
WChatUtil.java
package com.example.openwxchat.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.springframework.stereotype.Component; import java.io.IOException; @Component public class WChatUtil { //凭证有效时间,单位:秒。目前是7200秒之内的值。 private static Integer expiresIn = 7200; private final static String APPID = "wx9e6939****aadf0d"; // 你的小程序App ID private final static String APPSECRET = "4fc41066df*********ad68124ee39fd"; // 你的小程序App Secret // 存储AccessToken和其有效期的变量 private static String accessToken; private static long expireTime; // 过期时间戳,单位:秒 /** * 获取微信小程序的AccessToken。 * 如果AccessToken尚未获取或已过期,则会向微信服务器发起请求获取新的AccessToken。 * * @return 微信小程序AccessToken */ public static String getAccessToken() { // 如果AccessToken为空或已过期,则重新获取 if (accessToken == null || System.currentTimeMillis() > expireTime * 1000) { refreshAccessToken(); } return accessToken; } /** * 刷新AccessToken,向微信服务器发送请求获取新的AccessToken。 */ private static void refreshAccessToken() { // 构建请求URL String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + APPSECRET; // 使用HttpClient发送POST请求 HttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); try { HttpResponse response = httpClient.execute(httpPost); String responseJson = EntityUtils.toString(response.getEntity()); // 使用FastJSON解析JSON响应 JSONObject jsonObject = JSONObject.parseObject(responseJson); // 从JSON响应中获取AccessToken accessToken = jsonObject.getString("access_token"); // 计算过期时间戳 expireTime = System.currentTimeMillis() + (expiresIn - 60) * 1000; // 提前60秒过期,避免刚好过期时的并发问题 } catch (IOException e) { // 处理异常 } } //获取scheme public static String generateScheme(String jump_wxa) { String accessToken = getAccessToken(); // 拼接URL String url = "https://api.weixin.qq.com/wxa/generatescheme?access_token=" + accessToken; try { HttpClient client = HttpClients.createDefault(); // 构建一个Client HttpPost post = new HttpPost(url); // 构建一个Post请求 post.setHeader("Content-Type", "application/json"); // 设置请求头为JSON // 创建一个 JSON 格式的请求主体 JSONObject jsonRequest = new JSONObject(); jsonRequest.put("jump_wxa", JSON.parseObject(jump_wxa)); StringEntity input = new StringEntity(jsonRequest.toString(), "UTF-8"); post.setEntity(input); HttpResponse response = client.execute(post); // 提交POST请求 HttpEntity result = response.getEntity(); // 拿到返回的HttpResponse的"实体" String content = EntityUtils.toString(result); // 返回JSON格式的响应字符串 return content; } catch (Exception e) { e.printStackTrace(); // 返回错误信息 return "{\"error\": \"" + e.getMessage() + "\"}"; } } }
ApiController.java
package com.example.openwxchat.controller; import com.alibaba.fastjson.JSONObject; import com.example.openwxchat.param.GenerateschemeParam; import com.example.openwxchat.utils.WChatUtil; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RequestMapping("/wchat/api") @RestController public class ApiController { @PostMapping("/generatescheme") public Object generatescheme(@RequestBody GenerateschemeParam param){ JSONObject jump_wxa_json = new JSONObject(); jump_wxa_json.put("path",param.getPath()); jump_wxa_json.put("query",param.getQuery()); String scheme = WChatUtil.generateScheme(JSONObject.toJSONString(jump_wxa_json)); return ResponseEntity.ok(scheme); } }