900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 微信公众号开发之生成并扫描带参数的二维码(无需改动)

微信公众号开发之生成并扫描带参数的二维码(无需改动)

时间:2024-04-02 08:21:18

相关推荐

微信公众号开发之生成并扫描带参数的二维码(无需改动)

首先把参考的博文罗列出来:

1.微信公众号开发之生成并扫描带参数的二维码:

/qq_23543983/article/details/80228558

2.由多个参数组装生成一个场景值:

/xiaochengxudev/7203.htm

3.生成带参数二维码详见官网文档:

https://developers./doc/offiaccount/Message_Management/Receiving_event_pushes.html

4.具体步骤:可在微信测试平台https://mp./debug进行生成

步骤:生成access_token---->获取ticket------>获取二维码

下面直接贴代码:

一:主代码

/*** Copyright (C), -, XXX有限公司* FileName: WeixinController* Author: zhanglei* Date:/8/11 10:28* Description:* History:* <author><time><version><desc>* 作者姓名 修改时间 版本号 描述*/package com.asyware.game.controller;import com.asyware.game.utils.AccessTokenCache;import com.asyware.game.utils.MyX509TrustManager;import com.asyware.game.vo.AccessToken;import io.swagger.annotations.*;import lombok.extern.slf4j.Slf4j;import net.sf.json.JSONException;import net.sf.json.JSONObject;import org.springframework.web.bind.annotation.*;import .ssl.HttpsURLConnection;import .ssl.SSLContext;import .ssl.SSLSocketFactory;import .ssl.TrustManager;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import .ConnectException;import .URL;import java.security.SecureRandom;import java.util.Map;import static com.asyware.game.utils.WeiXinUtil.httpRequest;/*** 〈一句话功能简述〉<br> * 〈〉** @author zhanglei* @create /8/11* @since 1.0.0*/@RestController@RequestMapping("/weixin")@CrossOrigin@Api(tags = "二维码")@Slf4jpublic class WeixinController {// 获取Ticketpublic final static String ticket_url = "https://api./cgi-bin/qrcode/create?access_token=";//获取二维码public final static String erweima="https://mp./cgi-bin/showqrcode?ticket=";/*** 通过商户id获取ticket,返回二维码url* @param type 1_1 [第一个1:商户id 第二个1:代表关注二维码,2:代表核销二维码]* @return*/@ApiImplicitParams({@ApiImplicitParam(name="type",value = "1_1 [第一个1:商户id 第二个1:代表关注二维码,2:代表核销二维码]",required = false,dataType = "String",paramType = "path",example = "blues")})@ApiResponses({@ApiResponse(code = 200,message = "接口返回成功状态"),@ApiResponse(code = -1,message = "接口返回失败状态")})@ApiOperation(value = "通过商户id获取ticket,返回二维码url",notes = "")@PostMapping("/getTicket")public String getTicket(@RequestParam(name="type",required = true) String type){Map<String,Object> map = AccessTokenCache.getInstance().getAcessTokenAndExpiresIn("自己的appid","自己的appsecret");String accessToken = (String)map.get("access_token");//bodyString uu="{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\":"+type+"}}}";System.out.println(uu);JSONObject jsonObject = httpRequest(ticket_url+accessToken,"POST", uu);String ticket = jsonObject.getString("ticket");//二维码String ss=erweima+ticket;return ss;}}

到这步返回来的是ticket,要想获取二维码,直接在浏览器中输入上面返回来的ticket就好了,因为是一个get接口;

二:AccessTokenCache类

/*** Copyright (C), -, XXX有限公司* FileName: AccessTokenCache* Author: zhanglei* Date:/8/11 9:30* Description:* History:* <author><time><version><desc>* 作者姓名 修改时间 版本号 描述*/package com.asyware.game.utils;/*** 〈一句话功能简述〉<br> * 〈〉** @author zhanglei* @create /8/11* @since 1.0.0*/import com.asyware.game.vo.AccessToken;import java.util.Date;import java.util.HashMap;import java.util.Map;/*** 单例设计模式 缓存 accessToken expires_in*/public class AccessTokenCache {//缓存accessToken的Map,map中包含accessToken,expiresIn和缓存的时间戳timeprivate Map<String, String> map = new HashMap<String,String>();private static AccessTokenCache accessTokenCache = null;private AccessTokenCache() { }// 静态工厂方法public static AccessTokenCache getInstance() {if (accessTokenCache == null) {accessTokenCache = new AccessTokenCache();}return accessTokenCache;}public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}/*** 获取 accessToken expires_in* @param appid 第三方用户唯一凭证* @param appsecret 第三方用户唯一凭证密钥* @return*/public Map<String,Object> getAcessTokenAndExpiresIn(String appid, String appsecret) {Map<String,Object> result = new HashMap<String,Object>();AccessTokenCache accessTokenCache = AccessTokenCache.getInstance();Map<String, String> map = accessTokenCache.getMap();String time = map.get("time");String accessToken = map.get("access_token");String expiresIn = map.get("expires_in");Long nowDate = new Date().getTime();if (accessToken != null && time != null && expiresIn!=null) {//这里设置过期时间为微信规定的过期时间减去5分钟int outTime = (Integer.parseInt(expiresIn)-300) * 1000;if (nowDate - Long.parseLong(time) < outTime) {System.out.println("-----从缓存读取access_token:" + accessToken);//从缓存中拿数据为返回结果赋值result.put("access_token", accessToken);result.put("expires_in", expiresIn);}} else {AccessToken info = WeiXinUtil.getAccessToken(appid, appsecret);//实际中这里要改为你自己调用微信接口去获取accessToken和expires_inSystem.out.println("-----通过调用微信接口获取access_token:" + info.getAccessToken());//将信息放置缓存中map.put("time", nowDate + "");map.put("access_token", info.getAccessToken());map.put("expires_in", info.getExpiresIn()+"");//为返回结果赋值result.put("access_token", info.getAccessToken());result.put("expires_in", info.getExpiresIn());}return result;}}

三:WeiXinUtil类

/*** Copyright (C), -, XXX有限公司* FileName: WeiXinUtil* Author: zhanglei* Date:/8/11 9:31* Description:* History:* <author><time><version><desc>* 作者姓名 修改时间 版本号 描述*/package com.asyware.game.utils;import com.asyware.game.vo.AccessToken;import net.sf.json.JSONException;import net.sf.json.JSONObject;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import .ssl.HttpsURLConnection;import .ssl.SSLContext;import .ssl.SSLSocketFactory;import .ssl.TrustManager;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import .ConnectException;import .URL;import java.security.SecureRandom;/*** 〈一句话功能简述〉<br> * 〈〉** @author zhanglei* @create /8/11* @since 1.0.0*/public class WeiXinUtil {private static Logger log = LoggerFactory.getLogger(WeiXinUtil.class);// 获取access_token的接口地址(GET) 限2000(次/天)public final static String access_token_url = "https://api./cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";/*** 获取access_token* @param appid 凭证* @param appsecret 密钥* @return*/public static AccessToken getAccessToken(String appid, String appsecret) {AccessToken accessToken = null;String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appsecret);JSONObject jsonObject = httpRequest(requestUrl, "GET", null);// 如果请求成功if (null != jsonObject) {try {accessToken = new AccessToken();accessToken.setAccessToken(jsonObject.getString("access_token"));accessToken.setExpiresIn(jsonObject.getInt("expires_in"));} catch (JSONException e) {accessToken = null;// 获取token失败try {log.error("获取token失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));} catch (JSONException e1) {e1.printStackTrace();}}}return accessToken;}/*** 描述: 发起https请求并获取结果* @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpRequest(String requestUrl, String requestMethod, String outputStr) {System.out.println(outputStr);JSONObject jsonObject = null;StringBuffer buffer = new StringBuffer();try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();httpUrlConn.setSSLSocketFactory(ssf);httpUrlConn.setDoOutput(true);httpUrlConn.setDoInput(true);httpUrlConn.setUseCaches(false);// 设置请求方式(GET/POST)httpUrlConn.setRequestMethod(requestMethod);if ("GET".equalsIgnoreCase(requestMethod))httpUrlConn.connect();// 当有数据需要提交时if (null != outputStr) {OutputStream outputStream = httpUrlConn.getOutputStream();// 注意编码格式,防止中文乱码outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 将返回的输入流转换成字符串InputStream inputStream = httpUrlConn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}bufferedReader.close();inputStreamReader.close();// 释放资源inputStream.close();inputStream = null;httpUrlConn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("Weixin server connection timed out.");} catch (Exception e) {log.error("https request error:{}", e);}return jsonObject;}}

最后把上面用到的依赖贴出来,这套代码就直接可以用了,无需任何改动。

<dependency><groupId>commons-beanutils</groupId><artifactId>commons-beanutils</artifactId><version>1.9.3</version></dependency><dependency><groupId>commons-collections</groupId><artifactId>commons-collections</artifactId><version>3.2.1</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>net.sf.ezmorph</groupId><artifactId>ezmorph</artifactId><version>1.0.6</version></dependency><dependency><groupId>net.sf.json-lib</groupId><artifactId>json-lib</artifactId><version>2.2.3</version><classifier>jdk15</classifier><!-- jdk版本 --></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version><exclusions><exclusion><groupId>xml-apis</groupId><artifactId>xml-apis</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.9</version></dependency>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。