java H5 微信 分享 登陆 实例

微信测试号地址

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 + "&timestamp=" + 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";
    }


}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值