package io.renren.modules.wx.controller;
import com.alibaba.fastjson.JSON;
import io.renren.common.utils.HttpClientUtil;
import io.renren.common.utils.Result;
import io.renren.controller.ApiLoginController;
import io.renren.modules.member.dto.RyxyMemberDTO;
import io.renren.modules.member.entity.RyxyMemberEntity;
import io.renren.modules.member.service.RyxyMemberService;
import io.renren.modules.task.service.SysTaskService;
import io.renren.modules.wx.dto.WechatDataResponseDTO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@RestController
@RequestMapping("api/wechat/scan")
@Api(tags = "微信扫码")
public class WechatScanController {
@Autowired
ApiLoginController apiLoginController;
@Autowired
RyxyMemberService ryxyMemberService;
@Autowired
private SysTaskService sysTaskService;
@Value("${wechat.appid}")
private String appid;
@Value("${wechat.url}")
private String url;
@Value("${wechat.appsecret}")
private String appsecret;
public String getStartURLToGetCode() {
String takenUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
takenUrl= takenUrl.replace("APPID", appid);
takenUrl= takenUrl.replace("REDIRECT_URI",url);
takenUrl= takenUrl.replace("SCOPE", "snsapi_userinfo");
System.out.println(takenUrl);
return takenUrl;
}
@GetMapping("Qacode")
@ApiOperation("生成微信登地址")
public String Qacode(HttpServletResponse response) throws Exception {
return getStartURLToGetCode();
}
public void findJTICKET(WechatDataResponseDTO dto){
String token = getAccessToken();
String jsonString2 = HttpClientUtil.postJson("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+token+"&type=jsapi","",null);
Map map = JSON.parseObject(jsonString2, Map.class);
System.out.println(map);
//调用微信JS接口的临时票据
dto.setTicket ((String)map.get("ticket"));
}
@RequestMapping("getWxUserOpenIdByCode")
@ApiOperation(value = "获取微信oppid")
public WechatDataResponseDTO getAccess_token(String code, HttpSession session){
return getWechatDataResponseDTO(code, session);
}
private WechatDataResponseDTO getWechatDataResponseDTO(String code, HttpSession session) {
System.out.println(code);
String authUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
authUrl= authUrl.replace("APPID", appid);
authUrl = authUrl.replace("SECRET", appsecret);
authUrl = authUrl.replace("CODE", code);
String jsonString = HttpClientUtil.postJson(authUrl,"",null);
System.out.println("jsonString: " + jsonString);
WechatDataResponseDTO dto = JSON.parseObject(jsonString, WechatDataResponseDTO.class);
session.setAttribute("wx",dto);
// 直接注册 用户信息 直接登录 传递token
return dto;
}
public String getAccessToken(){
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+appsecret+"";
String jsonString = HttpClientUtil.postJson(url,"",null);
Map map=JSON.parseObject(jsonString, Map.class);
System.out.println(map);
return (String)map.get("access_token");
}
@RequestMapping(value = "/remindpage")
@ApiOperation(value = "分享地址链接")
public Map<String, Object> getWxConfig(String activity,HttpServletRequest request,HttpSession session) throws Exception {
Object wx = session.getAttribute("wx");
WechatDataResponseDTO dto=null;
if(wx!=null){
dto=(WechatDataResponseDTO)wx;
if(dto.getTicket()==null){
findJTICKET(dto);
}
}else{
}
String WechatShareTitle =activity+"_wechatShareTitle"; //配置文件中的分享标题
String WechatShareDesc = activity+"_wechatShareDesc"; //分享描述
String WechatSharePic = activity+"_wechatSharePic"; //分享的图片链接
long timestamp = System.currentTimeMillis() / 1000; // 必填,生成签名的时间戳
String nonceStr = UUID.randomUUID().toString(); // 必填,生成签名的随机串
Map<String, Object> shareMap = new HashMap<String, Object>();
String accessToken = dto.getAccess_token();
String jsapiTicket = dto.getTicket();
String requestUrl = request.getRequestURL().toString();
String requestParam = request.getQueryString();//获取携带的参数
if(requestParam != null){
requestUrl = requestUrl +"?"+ requestParam; //组成真正的URL
/* requestUrl = requestUrl +"?param=2"; //组成真正的URL*/
}
String sign = "jsapi_ticket=" + jsapiTicket + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + requestUrl;
System.out.println(sign);
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(sign.getBytes("UTF-8"));
String signature = byteToHex(crypt.digest());
shareMap.put("appId",appid ); // 注意这里参数名必须全部小写,且必须有序
shareMap.put("timestamp", timestamp);
shareMap.put("nonceStr", nonceStr);
shareMap.put("signature", signature);
shareMap.put("requestUrl", requestUrl);
shareMap.put("wechatShareTitle", WechatShareTitle);
shareMap.put("wechatShareDesc", WechatShareDesc);
shareMap.put("wechatSharePic", WechatSharePic);
shareMap.put("accessToken", accessToken);//微信凭证
System.out.println(shareMap);
return shareMap;
}
private String byteToHex(final byte[] hash) {
java.util.Formatter formatter = new java.util.Formatter();
for (byte b : hash) {
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
/**
* 微信消息接收和token验证
* @param model
* @param request
* @param response
* @throws IOException
*/
@RequestMapping("/ownerCheck")
public void ownerCheck(Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println(111);
boolean isGet = request.getMethod().toLowerCase().equals("get");
PrintWriter print;
if (isGet) {
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
// if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {
// try {
// print = response.getWriter();
// print.write(echostr);
// print.flush();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
}
}
@RequestMapping(value = "getWxUserOpenIdByCodeFengxi",produces = "text/html")
@ApiOperation(value = "分享直接返回html 页面")
public String getFenxiangtoken( HttpSession session,HttpServletRequest request) throws Exception{
// WechatDataResponseDTO dto = getWechatDataResponseDTO(code, session);
Map<String, Object> config = getWxConfig("hello", request, session);
return "<!DOCTYPE html>\n" +
"<html>\n" +
"<head>\n" +
" <meta charset=\"utf-8\">\n" +
" <title>微信JS-SDK Demo</title>\n" +
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, user-scalable=0\">\n" +
" <link rel=\"stylesheet\" href=\"https://www.weixinsxy.com/jssdk/css/style.css\">\n" +
"</head>\n" +
"<body ontouchstart=\"\">\n" +
"<div class=\"wxapi_container\">\n" +
" <div class=\"wxapi_index_container\">\n" +
" <ul class=\"label_box lbox_close wxapi_index_list\">\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-basic\">基础接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-share\">分享接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-image\">图像接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-voice\">音频接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-smart\">智能接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-device\">设备信息接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-location\">地理位置接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-webview\">界面操作接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-scan\">微信扫一扫接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-shopping\">微信小店接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-card\">微信卡券接口</a></li>\n" +
" <li class=\"label_item wxapi_index_item\"><a class=\"label_inner\" href=\"#menu-pay\">微信支付接口</a></li>\n" +
" </ul>\n" +
" </div>\n" +
" <div class=\"lbox_close wxapi_form\">\n" +
" <h3 id=\"menu-basic\">基础接口</h3>\n" +
" <span class=\"desc\">判断当前客户端是否支持指定JS接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"checkJsApi\">checkJsApi</button>\n" +
"\n" +
" <h3 id=\"menu-share\">分享接口</h3>\n" +
" <span class=\"desc\">获取“分享到朋友圈”按钮点击状态及自定义分享内容接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"onMenuShareTimeline\">onMenuShareTimeline</button>\n" +
" <span class=\"desc\">获取“分享给朋友”按钮点击状态及自定义分享内容接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"onMenuShareAppMessage\">onMenuShareAppMessage</button>\n" +
" <span class=\"desc\">获取“分享到QQ”按钮点击状态及自定义分享内容接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"onMenuShareQQ\">onMenuShareQQ</button>\n" +
" <span class=\"desc\">获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"onMenuShareWeibo\">onMenuShareWeibo</button>\n" +
" <span class=\"desc\">获取“分享到QZone”按钮点击状态及自定义分享内容接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"onMenuShareQZone\">onMenuShareQZone</button>\n" +
"\n" +
" <h3 id=\"menu-image\">图像接口</h3>\n" +
" <span class=\"desc\">拍照或从手机相册中选图接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"chooseImage\">chooseImage</button>\n" +
" <span class=\"desc\">预览图片接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"previewImage\">previewImage</button>\n" +
" <span class=\"desc\">上传图片接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"uploadImage\">uploadImage</button>\n" +
" <span class=\"desc\">下载图片接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"downloadImage\">downloadImage</button>\n" +
"\n" +
" <h3 id=\"menu-voice\">音频接口</h3>\n" +
" <span class=\"desc\">开始录音接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"startRecord\">startRecord</button>\n" +
" <span class=\"desc\">停止录音接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"stopRecord\">stopRecord</button>\n" +
" <span class=\"desc\">播放语音接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"playVoice\">playVoice</button>\n" +
" <span class=\"desc\">暂停播放接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"pauseVoice\">pauseVoice</button>\n" +
" <span class=\"desc\">停止播放接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"stopVoice\">stopVoice</button>\n" +
" <span class=\"desc\">上传语音接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"uploadVoice\">uploadVoice</button>\n" +
" <span class=\"desc\">下载语音接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"downloadVoice\">downloadVoice</button>\n" +
"\n" +
" <h3 id=\"menu-smart\">智能接口</h3>\n" +
" <span class=\"desc\">识别音频并返回识别结果接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"translateVoice\">translateVoice</button>\n" +
"\n" +
" <h3 id=\"menu-device\">设备信息接口</h3>\n" +
" <span class=\"desc\">获取网络状态接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"getNetworkType\">getNetworkType</button>\n" +
"\n" +
" <h3 id=\"menu-location\">地理位置接口</h3>\n" +
" <span class=\"desc\">使用微信内置地图查看位置接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"openLocation\">openLocation</button>\n" +
" <span class=\"desc\">获取地理位置接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"getLocation\">getLocation</button>\n" +
"\n" +
" <h3 id=\"menu-webview\">界面操作接口</h3>\n" +
" <span class=\"desc\">隐藏右上角菜单接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"hideOptionMenu\">hideOptionMenu</button>\n" +
" <span class=\"desc\">显示右上角菜单接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"showOptionMenu\">showOptionMenu</button>\n" +
" <span class=\"desc\">关闭当前网页窗口接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"closeWindow\">closeWindow</button>\n" +
" <span class=\"desc\">批量隐藏功能按钮接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"hideMenuItems\">hideMenuItems</button>\n" +
" <span class=\"desc\">批量显示功能按钮接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"showMenuItems\">showMenuItems</button>\n" +
" <span class=\"desc\">隐藏所有非基础按钮接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"hideAllNonBaseMenuItem\">hideAllNonBaseMenuItem</button>\n" +
" <span class=\"desc\">显示所有功能按钮接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"showAllNonBaseMenuItem\">showAllNonBaseMenuItem</button>\n" +
"\n" +
" <h3 id=\"menu-scan\">微信扫一扫</h3>\n" +
" <span class=\"desc\">调起微信扫一扫接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"scanQRCode0\">scanQRCode(微信处理结果)</button>\n" +
" <button class=\"btn btn_primary\" id=\"scanQRCode1\">scanQRCode(直接返回结果)</button>\n" +
"\n" +
" <h3 id=\"menu-shopping\">微信小店接口</h3>\n" +
" <span class=\"desc\">跳转微信商品页接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"openProductSpecificView\">openProductSpecificView</button>\n" +
"\n" +
" <h3 id=\"menu-card\">微信卡券接口</h3>\n" +
" <span class=\"desc\">批量添加卡券接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"addCard\">addCard</button>\n" +
" <span class=\"desc\">调起适用于门店的卡券列表并获取用户选择列表</span>\n" +
" <button class=\"btn btn_primary\" id=\"chooseCard\">chooseCard</button>\n" +
" <span class=\"desc\">查看微信卡包中的卡券接口</span>\n" +
" <button class=\"btn btn_primary\" id=\"openCard\">openCard</button>\n" +
"\n" +
" <h3 id=\"menu-pay\">微信支付接口</h3>\n" +
" <span class=\"desc\">发起一个微信支付请求</span>\n" +
" <button class=\"btn btn_primary\" id=\"chooseWXPay\">chooseWXPay</button>\n" +
" </div>\n" +
"</div>\n" +
"</body>\n" +
"<script src=\"https://res.wx.qq.com/open/js/jweixin-1.0.0.js\"></script>\n" +
"<script>\n" +
" /*\n" +
" * 注意:\n" +
" * 1. 所有的JS接口只能在公众号绑定的域名下调用,公众号开发者需要先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。\n" +
" * 2. 如果发现在 Android 不能分享自定义内容,请到官网下载最新的包覆盖安装,Android 自定义分享接口需升级至 6.0.2.58 版本及以上。\n" +
" * 3. 常见问题及完整 JS-SDK 文档地址:http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html\n" +
" *\n" +
" * 开发中遇到问题详见文档“附录5-常见错误及解决办法”解决,如仍未能解决可通过以下渠道反馈:\n" +
" * 邮箱地址:weixin-open@qq.com\n" +
" * 邮件主题:【微信JS-SDK反馈】具体问题\n" +
" * 邮件内容说明:用简明的语言描述问题所在,并交代清楚遇到该问题的场景,可附上截屏图片,微信团队会尽快处理你的反馈。\n" +
" */\n" +
" wx.config({\n" +
" debug: false,\n" +
" appId: '"+appid+"',\n" +
" timestamp: "+config.get("timestamp")+",\n" +
" nonceStr: '"+config.get("nonceStr")+"',\n" +
" signature: '"+config.get("signature")+"',\n" +
" jsApiList: [\n" +
" 'checkJsApi',\n" +
" 'onMenuShareTimeline',\n" +
" 'onMenuShareAppMessage',\n" +
" 'onMenuShareQQ',\n" +
" 'onMenuShareWeibo',\n" +
" 'onMenuShareQZone',\n" +
" 'hideMenuItems',\n" +
" 'showMenuItems',\n" +
" 'hideAllNonBaseMenuItem',\n" +
" 'showAllNonBaseMenuItem',\n" +
" 'translateVoice',\n" +
" 'startRecord',\n" +
" 'stopRecord',\n" +
" 'onVoiceRecordEnd',\n" +
" 'playVoice',\n" +
" 'onVoicePlayEnd',\n" +
" 'pauseVoice',\n" +
" 'stopVoice',\n" +
" 'uploadVoice',\n" +
" 'downloadVoice',\n" +
" 'chooseImage',\n" +
" 'previewImage',\n" +
" 'uploadImage',\n" +
" 'downloadImage',\n" +
" 'getNetworkType',\n" +
" 'openLocation',\n" +
" 'getLocation',\n" +
" 'hideOptionMenu',\n" +
" 'showOptionMenu',\n" +
" 'closeWindow',\n" +
" 'scanQRCode',\n" +
" 'chooseWXPay',\n" +
" 'openProductSpecificView',\n" +
" 'addCard',\n" +
" 'chooseCard',\n" +
" 'openCard'\n" +
" ]\n" +
" });\n" +
"</script>\n" +
"<script src=\"https://www.weixinsxy.com/jssdk/js/zepto.min.js\"></script>\n" +
"<script src=\"https://www.weixinsxy.com/jssdk/js/demo.js\"> </script>\n" +
"</html>\n";
}
}
java H5 微信 分享 登陆 实例
最新推荐文章于 2024-04-03 19:17:38 发布