Java微信分享接口开发

news2024/11/23 20:49:32

概述

微信JS-SDK实现自定义分享功能,分享给朋友,分享到朋友圈

详细

概述

概述

微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添加分享到朋友圈,关注微信号等按钮。

一、前言

(1)适合人群

1,JAVA服务端开发人员

2,初级人员开发人员

3,了解spring springboot + maven

3,了解小程序开发跟前端人员接口对接

(2)你需要准备什么?

1,积极主动学习

2,微信公众号开发基本流程

3,java后端几大框架掌握如(spring springboot maven )

二、前期准备工作

软件环境:eclipse

官方下载:https://www.eclipse.org/downloads/

1 ,基本需求

自定义微信分享的效果(自定义缩略图,标题,摘要)

三、项目结构

image.png

四、微信开发步骤

Java微信分享,步骤是

1、根据当前的url,获取signature,nonceStr,timestamp 和appId。 

2、通过signature,nonceStr,timestamp 和appId来配置微信 wx.config。 

3、通过wx.ready实现微信分享功能。

五、前端实现

引入微信JS-SDK

<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">
  //分享核心js代码
  //获取随机串
  var createNonceStr = function() {
     return Math.random().toString(36).substr(2, 15);
  };
     
  // timestamp
  var createTimeStamp = function () {
    return parseInt(new Date().getTime() / 1000) + '';
  }; 
 
  $.ajax({
        url :'http://jsaxwv.natappfree.cc/share/getSignature',
        type: 'post', //HTTP请求类型
        data: {
            url:location.href.split('#')[0], //url 如果写的是固定的值的话,分享之后在分享会报错
            timestamp: createTimeStamp,
            nonce_str: createNonceStr
        },
        timeout: 10000, //超时时间设置为10秒;
        success: function(data) {
         
            //微信初始化
            wx.config({
                debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: "", // 必填,公众号的唯一标识
                timestamp: data.timestamp , // 必填,生成签名的时间戳
                nonceStr: data.nonceStr, // 必填,生成签名的随机串
                signature: data.signature,// 必填,签名,见附录1
                jsApiList: ["onMenuShareTimeline","onMenuShareAppMessage","onMenuShareQQ"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
            });
            var openid=$("#openid").html();
             
            wx.ready(function(){
                var sdata = {
                   imgUrl: "http://jsaxwv.natappfree.cc/share/img/blog/logo.png", // 分享图标
                   link: "http://yst3qg.natappfree.cc/bootdo/wx/weixinAutoLogin?userId="+openid, 
                    title: "燕子约一周年庆典", // 分享标题
                   desc: "分享描述", // 分享描述
                    success: function () {
                        alert("分享成功");
                    },
                    cancel: function () {
                        alert("分享失败");
                    }
                };
                wx.onMenuShareAppMessage(sdata);// 发送给朋友
                //wx.onMenuShareTimeline(sdata);//分享到朋友圈
            });
            wx.error(function(res){
                // config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
               //alert("抱歉,服务器初始化错误。");
            });
        },
        error: function(xhr, type, errorThrown) {
            //异常处理;
            console.log(xhr);
            console.log(type);
            console.log(errorThrown);
        }
    });
 
    </script>
六、java后端实现
@RequestMapping(value = "/getSignature", method = RequestMethod.POST)
    @ResponseBody
    public Map WeixinController(HttpServletRequest request, HttpServletResponse response) {
        response.setHeader("Access-Control-Allow-Origin", "*");
        Map ret = new HashMap();
        //获取前台传来的三个参数
        String timestamp = request.getParameter("timestamp");
        String nonce_str = request.getParameter("nonce_str");
        String url = request.getParameter("url");
        logger.info("url"+url+"==============="+nonce_str+"============"+timestamp);
        String accessToken = null;
         
         accessToken = redisTemplate.opsForValue().get("accessToken")+"";  
         accessToken =  shareUtil.getToken(GET_TOKEN_URL, APP_ID, SECRET);// 获取token
        String ticket = shareUtil.getTicket(GET_SIGNATURE_URL,accessToken);    // 获取ticket
        String signature = shareUtil.getSignature(ticket,url,nonce_str,timestamp); //获取签名
      
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);
        return ret;
    }
工具类我就把整个贴上来了,其中有些方法是没有用到的。

getSignature()整个方法是微信分享中的核心方法,用来获取signature,nonceStr,timestamp 和appId这几个核心参数。
 // 获取access_token
    public static String getToken(String apiurl, String appid, String secret){
        //拼接访问地址
        String turl = String.format("%s?grant_type=client_credential&appid=%s&secret=%s", apiurl,appid, secret);
        
        HttpClient client = new DefaultHttpClient();
        //get请求
        HttpGet get = new HttpGet(turl);
        // 初始化解析json格式的对象
        JsonParser jsonparer = new JsonParser();
        String result = null;
        try
        {
            HttpResponse res = client.execute(get);
            String responseContent = null; // 初始化响应内容
            HttpEntity entity = (HttpEntity) res.getEntity();
            //设置编码格式
            responseContent = EntityUtils.toString((org.apache.http.HttpEntity) entity, "UTF-8");
            // 将json字符串转换为json对象
            JsonObject json = jsonparer.parse(responseContent).getAsJsonObject();
             
            if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
            {
                if (json.get("errcode") != null){
                    // 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"}
                    }
                else{
                    // 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200}
                    result = json.get("access_token").getAsString();
                }
            }
        }
        catch (Exception e){
            e.printStackTrace();
        }
        finally{
            // 关闭连接 ,释放资源
            client.getConnectionManager().shutdown();
            return result;
        }
    }

 // 获取getTicket

// 获取getTicket
    public static String getTicket(String apiurl,String access_token){  
         
        String turl = String.format("%s?access_token=%s&type=jsapi",apiurl,access_token);
         
        HttpClient client = new DefaultHttpClient();
        HttpGet get = new HttpGet(turl);
         
        JsonParser jsonparer = new JsonParser();// 初始化解析json格式的对象
        String result = null;
        try
        {
            HttpResponse res = client.execute(get);
            String responseContent = null; // 响应内容
            HttpEntity entity = res.getEntity();
            responseContent = EntityUtils.toString(entity, "UTF-8");
            JsonObject json = jsonparer.parse(responseContent).getAsJsonObject();
             
            // 将json字符串转换为json对象
            if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK){
                if (json.get("errcode") == null){
                    // 错误时微信会返回错误码等信息,{"errcode":40013,"errmsg":"invalid appid"}
                }
                else{
                    // 正常情况下{"access_token":"ACCESS_TOKEN","expires_in":7200}
                    result = json.get("ticket").getAsString();
                }
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            // 关闭连接 ,释放资源
            client.getConnectionManager().shutdown();
            return result;
        }
    }
七、申请说明与其他

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1051233.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抢先一步感受未来:Raspberry Pi 5正式发布!

在经历了几年全球供应链困境导致 Raspberry Pi 单板计算机的产能降低和零售价格上涨之后&#xff0c;今天终于迎来了更新。Raspberry Pi 4 上市四年后&#xff0c;今天Raspberry Pi 5正式发布&#xff01;新推出的 Raspberry Pi 5 配备了经过大幅改进升级的SoC&#xff0c;带来…

【owt-server】fix : node-gyp configure 报错:Error: read ECONNRESET

npm已经设置了registry 还报错 npm config set registry http://registry.npmmirror.comnode-gyp configure 指令 node-gyp configure 报错 read ECONNRESET root@k8s-master-2K4G:~/p2p/zdsvr-20201229# ./scripts/build.js -t mcu --check /root/p2p/zdsvr-20201229/build/li…

ipaguard界面概览

ipaguard界面概览 ipaguard界面分左右2块&#xff1a;左边菜单导航栏&#xff0c;右边的功能区 左侧菜单&#xff1a;按模块分成启动界面&#xff0c;代码模块&#xff0c;文件模块&#xff0c;重签名与测试模块 右侧主功能区会随着功能变化&#xff0c;但是整体分3块&#xf…

【2023研电赛】华东赛区一等奖:电动叉车永磁同步电机MTPA及弱磁控制研究

本文为2023年第十八届中国研究生电子设计华东赛区一等奖竞赛作品分享&#xff0c;参加极术社区的【有奖活动】分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&#xff01;&#xff0c;分享2023研电赛作品扩大影响力&#xff0c;更有丰富电子礼品等你来领&a…

5+SUMO化修饰+分型+实验,经典生信思路

今天给同学们分享一篇5SUMO化修饰分型实验的生信文章“SUMOylation patterns and signature characterize the tumor microenvironment and predict prognosis in lung adenocarcinoma”&#xff0c;这篇文章于2023年4月13日发表在Front Cell Dev Biol 期刊上&#xff0c;影响因…

直击2023中国(天津)国际汽车展览会 感受大运新能源的造车实力

作为汽车行业“新风口”&#xff0c;新能源汽车近年来的热度可谓居高不下。目前&#xff0c;各大车企纷纷抢滩新能源汽车赛道&#xff0c;发挥出各自的看家本领抢占更多市场话语权。相比盲目跟风的车企而言&#xff0c;拥有多年造车经验的大运集团&#xff0c;经过科学严谨的战…

熔断器Hystrix简介

使用熔断器防止服务雪崩-Hystrix 雪崩效应 在微服务架构中&#xff0c;根据业务来拆分成一个个的服务&#xff0c;服务与服务之间可以通过 RPC 相互调用&#xff0c;在 Spring Cloud 中可以用 RestTemplate Ribbon 和 Feign 来调用。为了保证其高可用&#xff0c;单个服务通常…

Sentinel学习——CAP理论,微服务中的雪崩问题,和Hystix的解决方案 Sentinel的相关概念 + 下载运行

前言 Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 本篇博客介绍CAP理论&#xff0c;微…

红黑树是如何实现的?

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …

QT使用前的知识

QT使用前的知识 常用的快捷键 源文件的内容解释 .pro文件的解释 头文件的解释 构建新的对象—组成对象树 槽函数 自定的信号和槽 槽函数的信号是一个重载函数时 电机按钮触发信号 调用无参数的信号 断开信号

GPT-4科研实践:数据可视化、统计分析、编程、机器学习数据挖掘、数据预处理、代码优化、科研方法论

查看原文>>>GPT4科研实践技术与AI绘图 GPT对于每个科研人员已经成为不可或缺的辅助工具&#xff0c;不同的研究领域和项目具有不同的需求。例如在科研编程、绘图领域&#xff1a;1、编程建议和示例代码: 无论你使用的编程语言是Python、R、MATLAB还是其他语言&#x…

详解C语言—文件操作

目录 1. 为什么使用文件 2. 什么是文件 3. 文件的使用 文件指针 文件的打开和关闭 三个标准的输入/输出流&#xff1a; 4. 文件的顺序读写 对字符操作&#xff1a; fputc&#xff1a; fgetc&#xff1a; 练习复制整个文件&#xff1a; 对字符串操作&#xff1a;…

C++ 并发编程实战 第七章 设计无锁数据结构

目录 7.1 定义和推论 7.1.1 非阻塞型数据结构 7.1.2 无锁数据结构 7.1.3 无需等待的数据结构 7.1.4 无锁数据结构的优点和缺点 7.2 无锁数据结构范例 7.2.1 实现线程安全的无锁栈 7.2.2 制止麻烦的内存泄漏&#xff1a;在无锁数据结构中管理内存 7.2.3 运用风险指针检…

排序:败者树和置换选择排序(解决外部排序中的优化问题)

1.算法目的&#xff08;败者树&#xff09; 解决多路平衡归并带来的问题。 在外部排序中&#xff0c;使用k路平衡归并策略, 选出一个最小元素需要对比关键字(k-1)次&#xff0c; 导致内部归并所需时间增加。&#xff08;可用“败者树”进行优化&#xff09; 2.败者树的定义 …

Spring源码分析(四) Aop全流程

一、Spring AOP基础概念 1、基础概念 连接点(Join point)&#xff1a;能够被拦截的地方&#xff0c;Spring AOP 是基于动态代理的&#xff0c;所以是方法拦截的&#xff0c;每个成员方法都可以称之为连接点&#xff1b;切点(Poincut)&#xff1a;每个方法都可以称之为连接点&…

从1开始的Matlab(快速入门)

MATLAB软件版本&#xff1a;MATLAB R2016b 本文是博主从零开始学Matlab的记录&#xff0c;适合第一次接触Matlab的同学阅读。 一、基础介绍 1.1界面认识 1.2变量命名 注&#xff1a;Matlab中的注释 %% 独占一行的注释&#xff08;有上下横线分割&#xff09; % 普通注释 …

Node.js 是如何处理请求的

前言&#xff1a;在服务器软件中&#xff0c;如何处理请求是非常核心的问题。不管是底层架构的设计、IO 模型的选择&#xff0c;还是上层的处理都会影响一个服务器的性能&#xff0c;本文介绍 Node.js 在这方面的内容。 TCP 协议的核心概念 要了解服务器的工作原理首先需要了…

【小白专属01】SpringBoot框架搭建

目录 前言 一、搭建环境 二、开始SpringBoot框架搭建 1. 打开IDEA 2. 新建项目 3. 选择版本和依赖 4. 目录结构 5. 启动项目 前言 上节回顾 上一节我们对智慧仓库管理系统的项目背景和项目效果进行的梳理&#xff0c;主要就是功能模块和实现步骤进行展示。想要从零开…

关于Adobe Acrobat Reader升级后界面布局变化-新旧布局的选择切换

Adobe Acrobat Reader 不知何时自动升级了&#xff0c;升级后界面布局发生了较大的变化&#xff1a;工具栏放到了左侧、书签栏放到了右侧。 如果对新界面布局不习惯&#xff0c;可在新界面下通过路径**【菜单】->【禁用新的 Acrobat Reader】、并重启 Acrobat Reader 后切…

【微信小程序】WXML模板语法

模板与绑定 1.数据绑定 1&#xff09;在data中定义数据 在页面对应的.js文件中把数据定义到data对象中即可 2&#xff09;在WXML中使用数据 把data中的数据绑定到页面中渲染&#xff0c;使用Mustache&#xff08;双大括号{{}}&#xff09;将变量名包起来即可&#xff0c;格式…