2016-06-13 09:10:06 soul_code 阅读数 4840
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1137 人正在学习 去看看 耿职

-环境、框架
1、服务器:tomcat8.0.32
2、后台框架:jfinal2.2
3、数据库:无
4、前端:wechat JS SDK
5、第三方jar:wechat4j、sauronsoftware
一、引入wechat JS SDK
这一步比较简单,按照微信给的开发文档一步一步配置就就行,但是步骤比较繁多,利用第三方依赖库wechat4j,只需几行代码即可实现JS JDK的导入。
1、首先是后台Action

public void authWeJs() {
        String url = getPara("url", null);
        long timestamp = System.currentTimeMillis() / 1000;
        String nonceStr = UUID.randomUUID().toString();
        String ticket = TokenProxy.jsApiTicket();
        String token = TokenProxy.accessToken();
        String appid = Config.instance().getAppid();
        String sortStr = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr
                + "&timestamp=" + timestamp + "&url=" + url;
        String signature = DigestUtils.sha1Hex(sortStr);
        setAttr("timestamp", timestamp);
        setAttr("signature", signature);
        setAttr("token", token);
        setAttr("appid", appid);
        setAttr("nonceStr", nonceStr);
        System.out.println(signature);
        System.out.println(sortStr);
        System.out.println(ticket);
        renderJson();
    }

2、前端JS请求Action获取接入SDK所需的appid、timestamp、nonceStr、signature

wx.config({
                debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
                appId: json.appid, // 必填,公众号的唯一标识
                timestamp:json.timestamp , // 必填,生成签名的时间戳
                nonceStr: json.nonceStr, // 必填,生成签名的随机串
                signature:json.signature,// 必填,签名,见附录1
                jsApiList: [
                            'checkJsApi',
                            'onMenuShareTimeline',
                            'onMenuShareAppMessage',
                            'onMenuShareQQ',
                            'onMenuShareWeibo',
                            'hideMenuItems',
                            'showMenuItems',
                            'hideAllNonBaseMenuItem',
                            'showAllNonBaseMenuItem',
                            'translateVoice',
                            'startRecord',
                            'stopRecord',
                            'onRecordEnd',
                            'playVoice',
                            'pauseVoice',
                            'stopVoice',
                            'uploadVoice',
                            'downloadVoice',
                            'chooseImage',
                            'previewImage',
                            'uploadImage',
                            'downloadImage',
                            'getNetworkType',
                            'openLocation',
                            'getLocation',
                            'hideOptionMenu',
                            'showOptionMenu',
                            'closeWindow',
                            'scanQRCode',
                            'chooseWXPay',
                            'openProductSpecificView',
                            'addCard',
                            'chooseCard',
                            'openCard'   
                ] // 必填,需要使用的JS接口列表,所有JS接口
            });

三、录制语言

// 1、开始录制
wx.startRecord(); 
//2、停止录制
wx.stopRecord({
    success: function (res) {
        var localId = res.localId;
    }
});
//3、上传录制好的音频文件,注意这里是上传的微信服务器,有效期只有三天,到目前位置一直都是使用的微信SDK的API,接下来我们需要上传到自己的服务器
wx.uploadVoice({
    localId: '', // 需要上传的音频的本地ID,由stopRecord接口获得
    isShowProgressTips: 1, // 默认为1,显示进度提示
        success: function (res) {
        var serverId = res.serverId; // 返回音频的服务器端ID
    }
});
// 4、然而JS JDK文档里面并没有告知如何下载多媒体资源(微信文档的坑),不过没有关系第三方依赖库wechat4j提供了获取持久化素材的方案,几行代码就可以将多媒体资源上传到自己服务器,引入wechat4j,只需两行代码
    MediaFile mediaFile = new MediaFile();
    byte[] download = mediaFile.download(media_id);
//media_id 就是第三步骤中的serverId
// 讲byte转为file
public static void byte2File(byte[] buf, String filePath, String fileName) {
        BufferedOutputStream bos = null;
        FileOutputStream fos = null;
        File file = null;
        try {
            File dir = new File(filePath);
            if (!dir.exists() && dir.isDirectory()) {
                dir.mkdirs();
            }
            file = new File(filePath + File.separator + fileName);
            fos = new FileOutputStream(file);
            bos = new BufferedOutputStream(fos);
            bos.write(buf);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (bos != null) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fos != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
// 第二个坑来了,从微信服务器下载的音频文件是amr格式,然而html的audio标签并不支持amr的播放,这里我们需要用到第二个三方依赖库sauronsoftware把amr转为MP3格式
public static void changeToMp3(String sourcePath, String targetPath) {
        File source = new File(sourcePath);
        File target = new File(targetPath);
        AudioAttributes audio = new AudioAttributes();
        Encoder encoder = new Encoder();
        audio.setCodec("libmp3lame");
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("mp3");
        attrs.setAudioAttributes(audio);
        try {
            encoder.encode(source, target, attrs);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (InputFormatException e) {
            e.printStackTrace();
        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }

至此,微信语言开发的流程基本结束,前端返回语音路径用audio标签播发即可
sauronsoftware.jar下载
wechat4j.jar

2017-03-09 13:34:10 tianlele_xl 阅读数 1207
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1137 人正在学习 去看看 耿职

Nodejs:微信JSSdk语音开发大致思路

1,注册微信jssdk

这里有一大堆啰嗦的事情做,先在后台做签名,获取ticket,signnature,appid等等。然后判断浏览器类型为微信,传递这一堆参数到客户端。再在客户端调用微信jssdk注册voice的play,start,download等等相关事件;

2,在客户端录音并上传:

主要步骤:

1.发起录音

2.停止录音(返回localId,可以用来预览,上传至微信服务器)

3.上传录音至微信服务器(返回serverId,用来下载)

4.下载录音文件(使用微信素材中多媒体下载接口)

5.格式转换并保存服务器

    - 使用wx.startRecord发起录音,这里注意的是60s限制;

    - 使用手动控制和超过60s自动结束录音,使用stopRecord方法停止,停止成功后,会返回localId;

    - 上传录音(localId)至微信服务器(uploadVoice),上传成功后会返回一个serverId;

    - 因为微信的录音文件有保存期限,所以需要自己下载上传至自己的服务器;在上传微信服务器成功后,将录音文件(serverId)上传至自己的服务器,保存文件位置到数据库;

    - 根据serverId调用微信的多媒体文件下载接口,这里要取得token(token建议保存到服务器缓存或者数据库)

    - 下载后的文件是一个amr文件,需要将其转换为mp3等其他格式,这里我使用的是ffmpeg;

3,使用h5 audio在客户端播放。

大概这个样子:
这里写图片描述

2019-06-27 14:17:24 RobotBing 阅读数 307
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1137 人正在学习 去看看 耿职

微信公众号后台有编辑模式和代码模式两种,设置成代码模式后,微信服务器会把公众号收到的所有消息以post方式发送到验证接入填写的url上,携带的请求参数为xml格式,由自己写的controller负责处理消息并按照微信要求的发送给微信服务器。Controller通过请求方式来分别处理验证接入和消息处理。

微信消息分为文本消息、语音消息、位置消息等多种格式,我做的是文本消息。文本消息的xml格式如下:

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
</xml>

参数

描述

ToUserName

开发者微信号

FromUserName

发送方帐号(一个OpenID

CreateTime

消息创建时间 (整型)

MsgType

消息类型,文本为text

Content

文本消息内容

MsgId

消息id64位整型

各字段含义为:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

开发需要先定义接受消息和发送消息的实体类,然后将对对象进行操作即可

代码如下:(参考codingwolf的博客)

InMsgPojo.java

import javax.xml.bind.annotation.XmlAccessType;

  import javax.xml.bind.annotation.XmlAccessorType;

  import javax.xml.bind.annotation.XmlRootElement;

  

  @XmlRootElement(name="xml")

  @XmlAccessorType(XmlAccessType.FIELD)

  public class InMsgPojo {

    // 开发者微信号

    protected String FromUserName;

    // 发送方帐号(一个OpenID)

    protected String ToUserName;

    // 消息创建时间

    protected Long CreateTime;

    /**

     * 消息类型

     * text 文本消息

     * image 图片消息

     * voice 语音消息

     * video 视频消息

     * music 音乐消息

     */

    protected String MsgType;

    // 消息id

    protected Long MsgId;

    // 文本内容

    private String Content;

    // 图片链接(由系统生成)

    private String PicUrl;

    // 图片消息媒体id,可以调用多媒体文件下载接口拉取数据

    private String MediaId;

  

    public String getFromUserName() {

        return FromUserName;

    }

  

    public void setFromUserName(String fromUserName) {

        FromUserName = fromUserName;

    }

  

    public String getToUserName() {

        return ToUserName;

    }

  

    public void setToUserName(String toUserName) {

        ToUserName = toUserName;

    }

  

    public Long getCreateTime() {

        return CreateTime;

    }

  

    public void setCreateTime(Long createTime) {

        CreateTime = createTime;

    }

  

    public String getMsgType() {

        return MsgType;

    }

  

    public void setMsgType(String msgType) {

        MsgType = msgType;

    }

  

    public Long getMsgId() {

        return MsgId;

    }

  

    public void setMsgId(Long msgId) {

        MsgId = msgId;

    }

  

    public String getContent() {

        return Content;

    }

  

    public void setContent(String content) {

        Content = content;

    }

  

    public String getPicUrl() {

        return PicUrl;

    }

  

    public void setPicUrl(String picUrl) {

        PicUrl = picUrl;

    }

  

    public String getMediaId() {

        return MediaId;

    }

  

    public void setMediaId(String mediaId) {

        MediaId = mediaId;

    }

  

    @Override

    public String toString() {

        return "InMsgPojo{" +

                "FromUserName='" + FromUserName + '\'' +

                ", ToUserName='" + ToUserName + '\'' +

                ", CreateTime=" + CreateTime +

                ", MsgType='" + MsgType + '\'' +

                ", MsgId=" + MsgId +

                ", Content='" + Content + '\'' +

                ", PicUrl='" + PicUrl + '\'' +

                ", MediaId='" + MediaId + '\'' +

                '}';

    }

}

 

OutMsgPojo.java

import javax.xml.bind.annotation.XmlAccessType;

  import javax.xml.bind.annotation.XmlAccessorType;

  import javax.xml.bind.annotation.XmlRootElement;

  

  @XmlRootElement(name="xml")

  @XmlAccessorType(XmlAccessType.FIELD)

  public class OutMsgPojo {

    // 发送方的账号

    protected String FromUserName;

    // 接收方的账号(OpenID)

    protected String ToUserName;

    // 消息创建时间

    protected Long CreateTime;

    /**

     * 消息类型

     * text 文本消息

     * image 图片消息

     * voice 语音消息

     * video 视频消息

     * music 音乐消息

     * news 图文消息

     */

    protected String MsgType;

  

    // 文本内容

    private String Content;

  

    public String getFromUserName() {

        return FromUserName;

    }

  

    public void setFromUserName(String fromUserName) {

        FromUserName = fromUserName;

    }

  

    public String getToUserName() {

        return ToUserName;

    }

  

    public void setToUserName(String toUserName) {

        ToUserName = toUserName;

    }

  

    public Long getCreateTime() {

        return CreateTime;

    }

  

    public void setCreateTime(Long createTime) {

        CreateTime = createTime;

    }

  

    public String getMsgType() {

        return MsgType;

    }

  

    public void setMsgType(String msgType) {

        MsgType = msgType;

    }

    public String getContent() {

        return Content;

    }

  

    public void setContent(String content) {

        Content = content;

    }

  

    @Override

    public String toString() {

        return "OutMsgPojo{" +

                "FromUserName='" + FromUserName + '\'' +

                ", ToUserName='" + ToUserName + '\'' +

                ", CreateTime=" + CreateTime +

                ", MsgType='" + MsgType + '\'' +

                ", Content='" + Content + '\'' +

                '}';

    }

}

 

WechatController.java

//微信自动回复,发送“你好”,回复“你也好”

  @RequestMapping(value = "/wechat", method = RequestMethod.POST, produces = "application/xml")

  public @ResponseBody

  Object doPost(@RequestBody InMsgPojo inMsgPojo) {

    //创建消息响应对象

    OutMsgPojo out = new OutMsgPojo();

    //把原来的发送方设置为接收方

    out.setToUserName(inMsgPojo.getFromUserName());

    //把原来的接收方设置为发送方

    out.setFromUserName(inMsgPojo.getToUserName());

    //获取接收的消息类型

    String msgType = inMsgPojo.getMsgType();

    //设置消息的响应类型

    out.setMsgType(msgType);

    //设置消息创建时间

    out.setCreateTime(new Date().getTime());

    //根据类型设置不同的消息数据

    if (inMsgPojo.getContent().equals("你好")) {

        out.setContent("你也好");

    } else {

        out.setContent("无法识别的请求!");

    }

    return out;

}

 

 

 

 

 

 

2017-07-20 00:33:45 qq_25146921 阅读数 5104
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1137 人正在学习 去看看 耿职

讲课大师现在可以把微信中的语音、文字、图片等消息,转播到企业微信中了。开发这个功能,花了快三周的时间,主要是各种事情把我弄得太苦逼,让我无法集中精力,感谢上海杜总红包的鼓励,现在终于可以发布第一个版本。

首先要登录企业微信的后台,新建一个应用,再把该应用的AgentId, Secret等信息在讲课接口中配置好,有了这些信息,讲课接口才能调用企业微信的API,把微信中的消息转发到企业微信中。初次配置,请按如下步骤。

1. 登录企业微信后台,在“企业应用”标签中,选择“创建应用”。


2. 上传一个logo并输入应用名称。需要注意的是,把“可见范围”设置成该应用可以发消息到的部门。比如想把消息发到市场部,那么可见范围里要包含市场部或者市场部的父部门。


3. 打开刚创建的应用,右上的状态开关默认是“已启用”的,无需更改,网页上显示的AgentId和Secret非常重要,务必保管好,不要泄露。如果Secret泄露了,别人将可以操作该应用。在讲课接口中配置企业微信时,需要输入这些信息,讲课接口才能调用API,把消息转发到企业微信中。


4. 进入“我的企业”标签,CorpID也需要在讲课接口中设置。


5. 打开“讲课接口”APP,点击“设置企业微信”按钮,配置好CorpID,AgentId,Secret,点“确定”保存。


6. 在微信中,发送课程或者配置自动转播的目标群时,系统会显示本文第2步中,“可见范围”里包含的部门及其子部门。选中后,将能把消息发送到部门里的所有人。


7. 也可以配置讲课接口的自动转发功能,在微信直播时,把消息自动转发到企业微信中。


8. 配置好后,就能把在微信里讲课时,把消息自动转到企业微信中了。

2016-01-12 11:57:00 weixin_30457881 阅读数 5
  • VUE开发旅游攻略移动端,零基础到实战,短信验证码,...

    【课程介绍】 课程目标:从零基础到学会实战开发vue项目 适用人群:会基础HTML,CSS,JS 接口后台:python 课程特色:提供项目接口,用python开发,提供短信验证码接口,接口和文档永久有效,学生的项目上线后可直接访问,可当做面试作品和大学生毕业设计  【课程收益】 1.从零基础掌握vue开发 2.掌握vue组件思维 3.了解什么是前后端分离开发 4.学会请求数据 5.学会vue高级功能使用 6.做出一个完整的上线项目 7.课程可当做大学生毕业设计 8.课程可当做面试作品

    1137 人正在学习 去看看 耿职

微信公众平台用户消息存在多种形式,图文消息、语音消息、视频消息等。针对不同的消息,避免一一对其进行繁杂处理实现,这里采用动态代理实现统一消息处理。自定义消息处理代理类实现用户消息处理。

 

在公众平台开发者模式配置公众号后台接口信息:

URL=http://weixin1234.ngrok.cc/Weixin/wechat。用户发送的消息将发送到此url的公账号后台。

这里为了在公众号后台启动时生成菜单,添加了统一处理过滤器WechatFilter,经由/wechat/的请求将通过此过滤器(在web.xml中配置)。

该过滤器主要作用是:

1、公众后台启动时执行创建菜单

2、在有各种消息处理时,进行分类处理(用户发出post请求)

3、最初的响应微信发出的Token验证(配置开发者模式必须)

下面主要介绍对各类消息在这个过滤器进行统一处理的实现:

I.       用户消息属于http-POST请求,所以在WeChatFilter中处理如下:

II.      WeChat.processing方法是处理实现:

 

III.     实现主要思想:

A.      传入用户发送的xml消息体作为参数

B.      将xml消息体转为消息类型对象

C.      获得自定义的消息处理器,没有则使用默认消息处理器

D.     取得消息类型,对不同类型消息做相应处理

E.      将发送对象转为xml输出

总结:这里采用动态代理机制实现统一消息处理,定义代理接口,对想实现的消息处理方法实现对应消息处理代理类,不用为各种消息分别实现对应的消息处理机制。具体代理实现未完待续…敬请期待

转载于:https://www.cnblogs.com/damonzh/p/5123889.html

没有更多推荐了,返回首页