微信消息接口指南
微信公众平台消息接口API指南
微信公众平台消息接口API指南微信公众平台消息接口 API 啊,这可是个很有趣的玩意儿!咱们先来说说什么是微信公众平台消息接口 API 吧。
简单来讲,它就像是一个神奇的通道,能让咱们的公众号和用户之间实现更紧密、更智能的交流。
比如说,你开了一家小小的花店,通过这个消息接口 API,当用户给你的公众号发送“我想要一束玫瑰”,你的公众号就能自动回复“亲,我们有各种颜色的玫瑰供您选择哦,红的热情,粉的浪漫,白的纯洁,您更倾向哪种呀?”这是不是超酷的!接下来,咱们详细了解一下它的一些特点和功能。
这个接口能让你获取用户发送的消息内容,包括文字、图片、语音等等。
就像有一次,我朋友的蛋糕店公众号,收到了用户发来的一张生日蛋糕的图片,然后通过 API 识别出了蛋糕的款式和风格,马上就能给出相应的价格和定制建议。
而且啊,它还能实现自动回复呢。
比如设置一些常见问题的答案,像“你们店几点开门?”“配送范围是哪里?”等等,用户一问,马上就能得到准确的回答,节省了大量的人工时间。
另外,消息接口 API 还支持群发消息。
想象一下,你有一个新品上市,通过这个功能,一下子就能通知到所有关注你的用户,多方便!不过,使用这个接口也不是那么简单的。
首先,你得有一定的技术基础,要懂编程,懂代码。
这对于像我这种技术小白来说,一开始真的是一头雾水。
还记得我第一次尝试的时候,看着那些密密麻麻的代码,感觉脑袋都要炸了。
还有啊,接口的使用也有一些规则和限制,可不能随意乱来。
比如说,发送消息的频率不能太高,不然可能会被微信认为是在骚扰用户,那可就糟糕啦。
但是,只要你认真研究,多尝试,多摸索,一定能掌握这个强大的工具。
就像我那个开蛋糕店的朋友,一开始也是磕磕绊绊的,但经过不断努力,现在他的公众号服务做得可好了,生意也越来越红火。
总之呢,微信公众平台消息接口 API 是个很有用的东西,但也需要咱们用心去学习和运用。
希望大家都能通过它,让自己的公众号变得更加出色,和用户建立更紧密的联系!。
微信开发-群发接口
微信开发-群发接⼝前⾯说到的都是⼀条⼀条的回复给⽤户消息,如果想要⼀次性发给多个⽤户,就要使⽤微信提供的群发接⼝了。
微信群发需要注意(其实就是微信⽂档⾥⾯的内容):1.次数不⼀样,认证的订阅号可以每天发送⼀条群发消息,⽽认证的服务号虽然每天可以发送100条,但是⽤户每⽉只能接收四条,多余四条的将发送失败。
2.群发的时候,认证的订阅号每天只能使⽤is_to_all群发⼀次或者在公众平台群发⼀次。
相应的,服务号每个⽉公众平台群发+is_to_all群发最多只能四次。
根据标签群发 1.这个接⼝是通过post请求的,请求参数根据群发的内容略有不同。
2.tagid就是以前的分组id现在改名叫标签,在微信公众平台->⽤户管理的右侧可以看到已经创建的标签名,获得标签id需要通过接⼝来获得已经创建的所有标签的id。
3.当is_to_all为true时,可以选择不填写tagid。
4.media_id需要通过微信上传素材接⼝获得。
5.群发接⼝可以发送卡券,cardid需要通过创建卡券获得或者卡券相关事件推送获得。
/***根据标签进⾏群发*/public function pushByTags(){$access_token=get_token();$url="https:///cgi-bin/message/mass/sendall?access_token=".$access_token;$data=array('filter'=>array('is_to_all'=>false,'tag_id'=>135),'text'=>array('content'=>'test'),'msgtype'=>'text');$result=json_decode(curl($url,json_encode($data)),true);if($result['errcode']==0){echo "群发成功";M('monthtuisong')->add(array('msgid'=>$result['msg_id'])); }else{echo "群发失败";}} 返回errcode=0只是意味着群发任务提交成功,并不意味着群发结束,后续的群发过程中可能受到各种因素的影响,需要⼀段时间才能群发完毕。
java调用个人微信接口收发消息
// 告诉客户端消息已收到 MessageUtil.sendMsg(ctx, EnumMsgType.MsgRe, vo.getId(), null);
WxAccountInfo account = weChatAccountService.findWeChatAccountInfoByWeChatId(req.getWeChatId()); //消息记录数据库 if (null != account){ asyncTaskService.saveMessage(account, req); }
log.debug(LocalDateTime.now()+" 微信好友发来聊天消息 对应的线程名: "+Thread.currentThread().getName());
//拦截消息 asyncTaskService.msgAopTask(ctx,req,vo.getAccessToken(), vo.getId()); //消息转发到pc端 asyncTaskService.msgSend2pc(req.getWeChatId(), EnumMsgType.FriendTalkNotice, req);
} catch (Exception e) { e.printStackTrace(); MessageUtil.sendErrMsg(ctx, EnumErrorCode.InvalidParam,vo.getId(), e.getMessage()); } }
微信公众平台订阅消息接口在哪具体接口位置介绍
微信公众平台订阅消息接口在哪具体接口
位置介绍
微信公众平台在近日新增了一次性订阅消息接口,但是这里有用户不知道微信公众平台订阅消息接口在哪,下面就让小编为大家带来接口位置,一起来看看吧。
具体接口位置介绍:
今天凌晨,微信公众平台为开发者们带来了全新的功能——新增“一次性订阅消息”接口,根据微信官方介绍,公众平台现开放一次性订阅消息接口将更方便开发者与微信用户之间建立联系,提供更好的服务。
App内,在需要提醒用户的场景中,例如比赛开始,投
诉处理反馈等。
用户可订阅一条微信内的提醒消息。
在事件发生时,用户可在微信内服务通知内收到一条消息通知。
(点此了解)
公众号和微信内网页,用户也可订阅消息提醒。
在未关注公众号时,可在服务通知中收到一条消息提醒,如果已关注公众号,则可以在公众号会话内收到消息提醒。
(点此了解)。
微信网页版接口详解
微信⽹页版接⼝详解本系列会讲述微信机器⼈技术的实现,第⼀讲主要了解微信⽹页版给我们提供的http接⼝,这⼀步是做⼀个基于微信⽹页版机器⼈的基础和难点。
本讲将微信⽹页版的主要接⼝罗列出,并给出了⼊参和返回值的含义和⽤法。
⼀些不常⽤的接⼝后续会逐渐补充,也欢迎⼤家与我交流。
后⾯⼏讲将会在代码中探讨微信机器⼈的设计思路,欢迎⼤家持续关注。
⼀、⽹页版微信提供的HTTP接⼝1、获取uuid说明:⽤于获取显⽰⼆维码以及登录所需的uuid,标识获取⼆维码和扫码的为同⼀个⽤户请求⽅式:GET地址:get参数:参数⽰例值说明appid wx782c26e4c19acffb固定值fun new固定值lang zh_CN表⽰中⽂字符集返回:window.QRLogin.code = 200; window.QRLogin.uuid = "wb7R2kx9dA==";2、显⽰⼆维码说明:展⽰⼀张⽤于登陆的⼆维码图⽚,地址⾥的{uuid}传第⼀步所获取的uuid请求⽅式:GET地址:get参数:参数⽰例值说明t webwx固定值返回:⼆维码的⼆进制流,浏览器打开会直接显⽰⼀张⼆维码图⽚3、轮询登录说明:尝试登录。
若此时⽤户⼿机已完成扫码并点击登录,则返回⼀个真正⽤于登录的url地址。
否则接⼝⼤概10s后返回未扫码或未登录的状态码请求⽅式:GET地址:get参数:参数⽰例值说明tip11:未扫描 0:⼀扫描uuid wb7R2kx9dA==第⼀步所获取的uuid返回:redirect_uri的值可以直接⽤于下⼀步的“登录并获取公参”请求window.code=200(408为未扫码,201为已扫码但未点击登录,200为成功登录);window.redirect_uri="https:///cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=AfrMMbhsnElmA7xc1R9CWUq-@qrticket_0&uuid=4ZnG7WZ0Cg= 4、登录并获取公参说明:访问后可获取⼀组公参,⽤于之后访问所有的接⼝。
微信公众平台发送模板消息(Java接口开发)
微信公众平台发送模板消息(Java接⼝开发)前⾔:最近⼀直再弄微信扫码推送图⽂消息和模板消息发送,感觉学习到了不少东西。
今天先总结⼀下微信公众平台模板消息的发送。
因为这个⾃⼰弄了很久,开始很多地⽅不明⽩,所以今天好好总结⼀下。
微信公众平台技术⽂档:⼀、概述模板消息仅⽤于公众号向⽤户发送重要的服务通知,只能⽤于符合其要求的服务场景中,如信⽤卡刷卡通知,商品购买成功通知等。
不⽀持⼴告等营销类消息以及其它所有可能对⽤户造成骚扰的消息。
关于使⽤规则,请注意:1、所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的⼊⼝,但只有认证后的服务号才可以申请模板消息的使⽤权限并获得该权限;2、需要选择公众账号服务所处的2个⾏业,每⽉可更改1次所选⾏业;3、在所选择⾏业的模板库中选⽤已有的模板进⾏调⽤;4、每个账号可以同时使⽤25个模板。
5、当前每个账号的模板消息的⽇调⽤上限为10万次,单个模板没有特殊限制。
【2014年11⽉18⽇将接⼝调⽤频率从默认的⽇1万次提升为⽇10万次,可在MP登录后的开发者中⼼查看】。
当账号粉丝数超过10W/100W/1000W时,模板消息的⽇调⽤上限会相应提升,以公众号MP后台开发者中⼼页⾯中标明的数字为准。
关于接⼝⽂档,请注意:1、模板消息调⽤时主要需要模板ID和模板中各参数的赋值内容;2、模板中参数内容必须以”.DATA”结尾,否则视为保留字;3、模板保留符号”{{ }}”。
看微信公众平台接⼝⽂档最开始我的内⼼是崩溃的,因为⽬录列表⼀开始就是设置所属⾏业,获取所属⾏业信息等。
后来整理思路,我们主要负责的功能的实现,就不去考虑那么多其他的内容,直接弄模板消息的发送。
但是发送模板之前有⼀个很重要的步骤,就是模板ID(template_id)。
微信公众平台发送模板消息有严格的要求,参考。
⼆、模板消息的设计这⾥是依靠微信公众平台测试公众号的模板消息接⼝来设计消息模板,通过⾏业类型来获取模板的同学还是参考微信公众平台的官⽅⽂档来学习。
java访问微信接口发送消息
java访问微信接⼝发送消息最近在开发activiti流程的时候有个需求:流程到达每个审批节点后,需要向该节点的审批⼈发送⼀个消息,提⽰有审批需要处理。
参考了⼀下微信的开发者⽂档和⽹络上的⼀些技术博客,现在记录⼀下。
以便后续继续研究微信开发。
【微信开发真的很好玩的】⾸先,你需要注册⼀个企业微信账号:https:///wework_admin/register_wx?from=myhome然后进⼊后台管理,创建⼀个应⽤上⾯标红的信息,都是开发测试需要⽤到的,需要记录⼀下。
先贴代码:WeChatData.javapackage com.xfma.wx.test;/*** 微信消息发送实体类* @author PC-MXF**/public class WeChatData {//发送微信消息的URLString sendMsgUrl="https:///cgi-bin/message/send?access_token="; /*** 成员账号*/private String touser;/*** 消息类型*/private String msgtype;/*** 企业⽤⽤的agentid*/private String agentid;/*** ⼗⼏接收map类型数据*/private Object text;public String getTouser() {return touser;}public void setTouser(String touser) {this.touser = touser;}public String getMsgtype() {return msgtype;}public void setMsgtype(String msgtype) {this.msgtype = msgtype;}public String getAgentid() {return agentid;}public void setAgentid(String agentid) {this.agentid = agentid;}public Object getText() {return text;}public void setText(Object text) {this.text = text;}} WeChatUrlData.javapackage com.xfma.wx.test;/*** 微信授权请求* @author PC-MXF**/public class WeChatUrlData {/*** 企业Id*/private String corpid;/*** secret管理组的凭证密钥*/private String corpsecret;/*** 获取ToKen的请求*/private String Get_Token_Url;/*** 发送消息的请求*/private String SendMessage_Url;public String getCorpid() {return corpid;}public void setCorpid(String corpid) {this.corpid = corpid;}public String getCorpsecret() {return corpsecret;}public void setCorpsecret(String corpsecret) {this.corpsecret = corpsecret;}public String getGet_Token_Url() {return Get_Token_Url;}public void setGet_Token_Url(String corpid,String corpsecret) {Get_Token_Url = "https:///cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret; }public String getSendMessage_Url() {SendMessage_Url = "https:///cgi-bin/message/send?access_token=";return SendMessage_Url;}public void setSendMessage_Url(String sendMessage_Url) {SendMessage_Url = sendMessage_Url;}} WeChatMsgSend.javapackage com.xfma.wx.test;import java.io.IOException;import java.text.SimpleDateFormat;import java.util.HashMap;import java.util.Map;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;import org.slf4j.LoggerFactory;import com.google.gson.Gson;import com.google.gson.reflect.TypeToken;/*** 微信发送消息** @author PC-MXF**/public class WeChatMsgSend {private CloseableHttpClient httpClient;/*** ⽤于提交登录数据*/private HttpPost httpPost;/*** ⽤于获得登陆后页⾯*/private HttpGet httpGet;public static final String CONTENT_TYPE = "Content-Type";SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");private static Gson gson = new Gson();/*** 微信授权请求,GET类型,获取授权响应,⽤于其他⽅法截取token** @param Get_Token_Url* @return String 授权响应内容* @throws IOException*/protected String toAuth(String Get_Token_Url) throws IOException {httpClient = HttpClients.createDefault();httpGet = new HttpGet(Get_Token_Url);CloseableHttpResponse response = httpClient.execute(httpGet);String resp = "";try {HttpEntity entity = response.getEntity();resp = EntityUtils.toString(entity, "utf-8");EntityUtils.consume(entity);} catch (Exception e) {e.getStackTrace();} finally {response.close();}LoggerFactory.getLogger(getClass()).info(" resp:{}", resp);return resp;}/*** corpid应⽤组织编号 corpsecret应⽤秘钥获取toAuth(String* Get_Token_Url)返回结果中键值对中access_token键的值** @param*/public String getToken(String corpid, String corpsecret) throws IOException {WeChatMsgSend sw = new WeChatMsgSend();WeChatUrlData uData = new WeChatUrlData();uData.setGet_Token_Url(corpid, corpsecret);String resp = sw.toAuth(uData.getGet_Token_Url());System.out.println("resp=====:" + resp);try {Map<String, Object> map = gson.fromJson(resp, new TypeToken<Map<String, Object>>() {}.getType());return map.get("access_token").toString();} catch (Exception e) {e.getStackTrace();return resp;}}/*** 创建微信发送请求post数据 touser发送消息接收者,msgtype消息类型(⽂本/图⽚等), application_id应⽤编号。
微信接口文档
PizzaPizza项目前言:为了方面大伙快速上手微信接口开放,所以自己平时抽空时写了此项目,纯属个人项目,纯开源,纯娱乐,里面包括微信第三方平台,跟微信接口调用,好废话不多说,开始详细说明A.项目截图B.C.D.通过以上截图基本了解了项目的整体架构层次,当然你们在开发是需要用的到,主要在com.pizza.wechat.request.api此包下的对象方法,此包下的方面都依赖com.pizza.wechat.request.APIHttpConnect这个类,这个类是最底层的调用类,用来模拟pos/get https请求,多媒体文件的上传下载。
E.如果你是做第三方平台开发,你会需要用到com.pizza.wechat.service包下的两个类OSAuthorizeNotify:这个对象是用来处理第三方接收授权消息,处理类里面包括一个方法process跟一个构造函数,构造函数需要传递两个参数Public OSAuthorizeNotify(AuthNotify service,HttpServletRequest request)第一个参数是用来处理授权信息的AuthNotify接口实现,第二个不用多说了吧,new完此对象以后记得调用process方法,此方面里面你不用关心,你只需要实现AuthNotify便可,此接口有微信推送过来的component_verify_ticket数据,一直取消授权事件通知OSMessageNotify:这个对象专门用来处理微信推送给授权方的所有事件消息,他里面也包含一个process方法跟构造函数publicOSMessageNotify(MessageNotify service, HttpServletRequest request)第一个参数也是一个接口,他里面定义了所有的微信接口事件类型,大伙个可以通过实现此接口来,实现自己的所有业务逻辑,里面的事件包括Text,image,link,location,click,qrscan,subscribe,unsubscribe ,voice,event,一次按此顺序说明文本消息事件,图片消息事件,点击连接事件,地址信息事件,点击菜单事件,扫描二维码事件,关注事件,取消关注事件,语音事件,其他事件。
微信公众平台开发文档
微信公众平台开发者文档1 新手接入 (1)1,1 接入指南 (1)1.2 开发者规范 (2)2 基础支持 (3)2.1 获取access_token (3)2.2 全局返回码说明 (4)2.3 接口频率限制说明 (7)2.4 上传下载多媒体文件 (9)1 新手接入1,1 接入指南第一步:申请消息接口在公众平台网站的高级功能–开发模式页,点击“成为开发者”按钮,填写URL和Token,其中URL是开发者用来接收微信服务器数据的接口URL。
Token可由开发者任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)。
第二步:验证URL有效性开发者提交信息后,微信服务器将发送GET请求到填写的URL上,GET请求携带四个参数:开发者通过检验signature对请求进行校验(下面有校验方式)。
若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
检验signature的PHP示例代码:第三步:成为开发者验证URL有效性成功后即接入生效,成为开发者。
如果公众号类型为服务号(订阅号只能使用普通消息接口),可以在公众平台网站中申请认证,认证成功的服务号将获得众多接口权限,以满足开发者需求。
此后用户每次向公众号发送消息、或者产生自定义菜单点击事件时,响应URL将得到推送。
公众号调用各接口时,一般会获得正确的结果,具体结果可见对应接口的说明。
返回错误时,可根据返回码来查询错误原因。
全局返回码说明用户向公众号发送消息时,公众号方收到的消息发送者是一个OpenID,是使用用户微信号加密后的结果,每个用户对每个公众号有一个唯一的OpenID。
此外请注意,微信公众号接口只支持80接口。
1.2 开发者规范开发者进行公众号开发时,除了需要满足每个接口的规范限制、调用频率限制外,还需特别注意模版消息、用户数据等敏感信息的使用规范。
涉及用户数据时:∙您的服务需要收集用户任何数据的,必须事先获得用户的明确同意,且仅应当收集为运营及功能实现目的而必要的用户数据,同时应当告知用户相关数据收集的目的、范围及使用方式等,保障用户知情权。
python使用itchat发送微信消息提醒
python使⽤itchat发送微信消息提醒最近在学习⼀点python,先找了找有趣的应⽤,实际修改跑了⼀下提⾼兴趣程度。
找到itchat,它的简介是这样的:“itchat是⼀个开源的微信个⼈号接⼝,使⽤python调⽤微信从未如此简单。
使⽤不到三⼗⾏的代码,你就可以完成⼀个能够处理所有信息的微信机器⼈。
当然,该api的使⽤远不⽌⼀个机器⼈,更多的功能等着你来发现,⽐如。
该接⼝与公众号接⼝共享类似的操作⽅式,学习⼀次掌握两个⼯具。
如今微信已经成为了个⼈社交的很⼤⼀部分,希望这个项⽬能够帮助你扩展你的个⼈的微信号、⽅便⾃⼰的⽣活。
”itchat使⽤需要先下载安装,安装过程很简单,直接pip install itchat我安装的python3.6⾃带pip,如果没有pip的话我建议升级python。
在⽹上已经有不少itchat的应⽤,最简单的就是查找特定⽤户来发送微信消息。
我结合另⼀个⽰范将消息扩展了⼀点:间隔特定时间给特定的好友发送微信消息提醒(久坐提醒?)代码如下:1#-*-coding:utf8-*-2import itchat3import datetime, os, platform,time45def timerfun(sched_time) :6 flag = 07while True:8 now = datetime.datetime.now()9if now > sched_time and now < sched_time + datetime.timedelta(seconds=1) : # 因为时间秒之后的⼩数部分不⼀定相等,要标记⼀个范围判断10 send_move()11 time.sleep(1) # 每次判断间隔1s,避免多次触发事件12 flag = 113else :14#print('schedual time is {0}'.format(sched_time))15#print('now is {0}'.format(now))16if flag == 1 :17 sched_time = sched_time + datetime.timedelta(hours=1) # 把⽬标时间增加⼀个⼩时,⼀个⼩时后触发再次执⾏18 flag = 01920def send_move:21# nickname = input('please input your firends\' nickname : ' )22# 想给谁发信息,先查找到这个朋友,name后填微信备注即可,deepin测试成功23# users = itchat.search_friends(name=nickname)24 users = itchat.search_friends(name='⼤壮') # 使⽤备注名来查找实际⽤户名25#获取好友全部信息,返回⼀个列表,列表内是⼀个字典26print(users)27#获取`UserName`,⽤于发送消息28 userName = users[0]['UserName']29 itchat.send("该起来动⼀下了!",toUserName = userName)30print('succeed')3132if__name__=='__main__':33 itchat.auto_login(hotReload=True) # ⾸次扫描登录后后续⾃动登录34 sched_time = datetime.datetime(2017,11,6,16,24,10) #设定初次触发事件的事件点35print('run the timer task at {0}'.format(sched_time))36 timerfun(sched_time)有⼏个地⽅调试了⼀下:1. 第9⾏判断时间是否到达指定时间处,因为now = datetime.datetime.now()返回的时间精确到了ms,所以直接拿精确到s的特定时间去⽐较会移植为False。
微信接口开发教程-微信接口开发教程
微信接口开发教程-微信接口开发教程微信公众帐号开发教程第3篇-开发模式启用及接口配置微信公众帐号开发教程第3篇-开发模式启用及接口配置来源:柳峰的专栏时间:2016-09-09 16:07:04编辑模式与开发模式微信公众帐号申请成功后,要想接收处理用户的请求,就必须要在高级功能里进行配置,点击高级功能,将看到如下界面:从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种编辑模式与开发模式微信公众帐号申请成功后,要想接收处理用户的请求,就必须要在“高级功能”里进行配置,点击“高级功能”,将看到如下界面:从上图中可以看到,高级功能包含两种模式:编辑模式和开发模式,并且这两种模式是互斥关系,即两种模式不能同时开启。
那两种模式有什么区别呢?作为开发人员到底要开启哪一种呢?编辑模式:主要针对非编程人员及信息发布类公众帐号使用。
开启该模式后,可以方便地通过界面配置“自定义菜单”和“自动回复的消息”。
开发模式:主要针对具备开发能力的人使用。
开启该模式后,能够使用微信公众平台开放的接口,通过编程方式实现自定义菜单的创建、用户消息的接收/处理/响应。
这种模式更加灵活,建议有开发能力的公司或个人都采用该模式。
启用开发模式微信公众帐号注册完成后,默认开启的是编辑模式。
那么该如何开启开发模式呢?操作步骤如下:1)点击进入编辑模式,将右上角的编辑模式开关由“开启”切换到“关闭”,如下图所示:2)点击高级功能进入到开发模式,将右上角的开发模式开关由“关闭”切换到“开启”,但在切换时会遇到如下提示:提示需要我们先成为开发者,才能开启开发模式。
那就先点击下图所示的“成为开发者”按钮:如果提示资料不全,那就先补齐资料再回来继续操作。
需要补全的资料有公众帐号头像、描述和运营地区。
待资料补全后,再次点击“成为开发者”,这时将看到接口配置信息界面,如下图所示:这里需要填写URL和Token两个值。
URL指的是能够接收处理微信服务器发送的GET/POST请求的地址,并且是已经存在的,现在就能够在浏览器访问到的地址,这就要求我们先把公众帐号后台处理程序开发好并部署在公网服务器上。
微信公众平台消息接口开发(3)中英翻译
微信公众平台消息接⼝开发(3)中英翻译要做⼀个翻译账号,有以下⼏步:⼀. 有翻译接⼝:下⾯是申请介绍:申请完成后,会收到邮件,邮件中有api key:数据接⼝/openapi.do?keyfrom=<keyfrom>&key=<key>&type=data&doctype=<doctype>&version=1.1&q=要翻译的⽂本版本:1.1,请求⽅式:get,编码⽅式:utf-8主要功能:中英互译,同时获得有道翻译结果和有道词典结果(可能没有)参数说明: type - 返回结果的类型,固定为data doctype - 返回结果的数据格式,xml或json或jsonp version - 版本,当前最新版本为1.1 q - 要翻译的⽂本,必须是UTF-8编码,字符长度不能超过200个字符,需要进⾏urlencode编码errorCode: 0 - 正常 20 - 要翻译的⽂本过长 30 - ⽆法进⾏有效的翻译 40 - 不⽀持的语⾔类型 50 - ⽆效的keyjson数据格式举例{"errorCode":0"query":"good","translation":["好"], // 有道翻译"basic":{ // 有道词典-基本词典"phonetic":"gʊd""uk-phonetic":"gʊd" //英式发⾳"us-phonetic":"ɡʊd" //美式发⾳"explains":["好处","好的""好"]},"web":[ // 有道词典-⽹络释义{"key":"good","value":["良好","善","美好"]},{...}]}⼆程序实现:有道翻译的源码:需要⾃⼰申请key,然后填⼊微信调⽤define("TOKEN", "qq612312312312");$wechatObj = new wechatCallbackapiTest();$wechatObj->responseMsg();class wechatCallbackapiTest{public function valid(){$echoStr = $_GET["echostr"];//valid signature , optionif($this->checkSignature()){echo$echoStr;exit;}}public function responseMsg(){//get post data, May be due to the different environments$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];logger("R ".$postStr);//extract post dataif (!empty($postStr)){$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$RX_TYPE = trim($postObj->MsgType);switch ($RX_TYPE){case "text":$resultStr = $this->receiveText($postObj);break;case "event":$resultStr = $this->receiveEvent($postObj);break;default:$resultStr = "unknow msg type: ".$RX_TYPE;break;}logger("T ".$resultStr);echo$resultStr;}else {echo "";exit;}}private function checkSignature(){$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = TOKEN;$tmpArr = array($token, $timestamp, $nonce);sort($tmpArr);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){return true;}else{return false;}}private function receiveText($object){$funcFlag = 0;$keyword = trim($object->Content);$resultStr = "";$cityArray = array();$contentStr = "";$needArray = false;$illegal = false;$saytome = false;if (1 == 1){$contentStr = translate($keyword);$resultStr = $this->transmitText($object, $contentStr, $funcFlag);return$resultStr;}//Content 消息内容,⼤⼩限制在2048字节,字段为空为不合法请求return$resultStr;}private function receiveEvent($object){$contentStr = "";switch ($object->Event){case "subscribe":$contentStr = "请直说,我将为你⾃动翻译";break;case "unsubscribe":$contentStr = "";break;case "CLICK":switch ($object->EventKey){default:$contentStr = "receive a eventkey: ".$object->EventKey;break;}break;default:$contentStr = "receive a new event: ".$object->Event;break;}$resultStr = $this->transmitText($object, $contentStr);return$resultStr;}private function transmitText($object, $content, $flag = 0){$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>%d</FuncFlag></xml>";$resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content, $flag);return$resultStr;}}四,效果演⽰中⽂翻译成英语==================================欢迎关注⽅倍⼯作室微信,了解我们及⾏业的最新动态。
微信公众平台消息接口API指南
简介微信公众平台消息接口为开发者提供了一种新的消息处理方式。
微信公众平台消息接口为开发者提供与用户进行消息交互的能力。
对于成功接入消息接口的微信公众账号,当用户发消息给公众号,微信公众平台服务器会使用http请求对接入的网址进行消息推送,第三方服务器可通过响应包回复特定结构,从而达到回复消息的目的。
申请消息接口点击申请,填写网址url和token,其中token可由开发者可以任意填写,用作生成签名。
网址接入公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:开发者通过检验signature对请求进行校验(下面有校验方式)。
若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce 参数。
加密/校验流程:1. 将token、timestamp、nonce三个参数进行字典序排序2. 将三个参数字符串拼接成一个字符串进行sha1加密3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信消息推送当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL 上。
结构如下:文本消息<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>图片消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[this is a url]></PicUrl><MsgId>1234567890123456</MsgId></xml>地理位置消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId></xml>链接消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[link]]></MsgType><Title><![CDATA[公众平台官网链接]]></Title><Description><![CDATA[公众平台官网链接]]></Description> <Url><![CDATA[url]]></Url><MsgId>1234567890123456</MsgId>事件推送事件推送只支持微信4.5版本,即将开放,敬请期待。
微信API接口大全
微信API接⼝⼤全微信⼊⼝绑定,微信事件处理,微信API全部操作包含在这些⽂件中。
微信⽀付、微信红包、微信卡券、微信⼩店。
1. [代码]index.php<?phpinclude_once 'lib.inc.php';$wcObj = new WeChat("YOUKUIYUAN");$wcObj->wcValid();2. [代码]微信⼊⼝类<?php/*** Description of wechat** @author Administrator*/class WeChat extends WxApi{public $token = "";//put your code herepublic function __construct($token = "") {parent::__construct();$this->token = $token;}public function wcCheckSignature(){try{if (empty($this->token)) {throw new Exception('TOKEN is not defined!');}$signature = $_GET["signature"];$timestamp = $_GET["timestamp"];$nonce = $_GET["nonce"];$token = $this->token;$tmpArr = array($token, $timestamp, $nonce);// use SORT_STRING rulesort($tmpArr, SORT_STRING);$tmpStr = implode( $tmpArr );$tmpStr = sha1( $tmpStr );if( $tmpStr == $signature ){return true;}else{return false;}}catch (Exception $e) {echo 'Message: ' .$e->getMessage();}}public function wcValid(){$echoStr = isset($_GET["echostr"]) && !empty($_GET["echostr"]) ? addslashes($_GET["echostr"]) : NULL;if(is_null($echoStr)){$this->wcMsg();}else{//valid signature , optionif($this->wcCheckSignature()){echo $echoStr;exit;}else{exit();}}}public function wcMsg(){//get post data, May be due to the different environments$postStr = isset($GLOBALS["HTTP_RAW_POST_DATA"]) && !empty($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS["HTTP_RAW_POST_DATA"] : ""; if(!empty($postStr)){libxml_disable_entity_loader(true);$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);$this->zcLog(TRUE,$postObj);$fromUsername = $postObj->FromUserName;$toUsername = $postObj->ToUserName;$MsgType = $postObj->MsgType;if($MsgType == 'event'){//执⾏事件相应$Event = $postObj->Event;switch ($Event) {case 'subscribe'://关注break;case 'unsubscribe'://取消关注break;case 'SCAN'://扫描break;case 'LOCATION'://地址break;case 'CLICK'://点击时间break;case 'VIEW'://跳转break;case 'card_pass_check'://卡券审核通过break;case 'card_not_pass_check'://卡券审核失败break;case 'user_get_card'://⽤户领取卡券break;case 'user_del_card'://⽤户删除卡券break;case 'user_view_card'://⽤户浏览会员卡break;case 'user_consume_card'://⽤户核销卡券break;case 'merchant_order'://微⼩店⽤户下单付款break;default:break;}}else{switch ($MsgType) {case 'text'://⽂本格式break;case 'image'://图⽚格式break;case 'voice'://声⾳break;case 'video'://视频break;case 'shortvideo'://⼩视频break;case 'location'://上传地理位置break;case 'link'://链接相应break;default:break;}}////////////////////////////////////////////////////////////////////$keyword = trim($postObj->Content);$time = time();$textTpl = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[%s]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>";if(!empty( $keyword )){$msgType = "text";$contentStr = "Welcome to wechat world!";$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr); echo $resultStr;}else{echo "Input something...";}////////////////////////////////////////////////////////////////////}else{echo "暂时没有任何信息!";exit;}}//⽇志LOGpublic function zcLog($errcode , $errmsg){$this->returnAy = array();$this->returnAy['errcode'] = $errcode;$this->returnAy['errmsg'] = $errmsg;$this->returnAy['errtime'] = date("Y-m-d H:i:s",time());$logfile = fopen("logfile_".date("Ymd",time()).".txt", "a+");$txt = json_encode($this->returnAy)."\n";fwrite($logfile, $txt);fclose($logfile);//return $this->returnAy;}}3. [代码]微信操作类 - 更新了⾃定义菜单部分<?php/********************************************************* @author Kyler You <QQ:2444756311>* @link /wiki/home/index.html* @version 2.0.1* @uses $wxApi = new WxApi();* @package 微信API接⼝陆续会继续进⾏更新********************************************************/class WxApi {//const appId = "";//const appSecret = "";const appId = "";const appSecret = "";//const mchid = ""; //商户号//const privatekey = ""; //私钥public $parameters = array();public function __construct(){}/***************************************************** 微信提交API⽅法,返回微信指定JSON****************************************************/public function wxHttpsRequest($url,$data = null){$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)){curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$output = curl_exec($curl);curl_close($curl);return $output;}/***************************************************** 微信带证书提交数据 - 微信红包使⽤****************************************************/public function wxHttpsRequestPem($url, $vars, $second=30,$aHeader=array()){$ch = curl_init();//超时时间curl_setopt($ch,CURLOPT_TIMEOUT,$second);curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);//这⾥设置代理,如果有的话//curl_setopt($ch,CURLOPT_PROXY, '10.206.30.98');//curl_setopt($ch,CURLOPT_PROXYPORT, 8080);curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);//以下两种⽅式需选择⼀种//第⼀种⽅法,cert 与 key 分别属于两个.pem⽂件//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/apiclient_cert.pem');//默认格式为PEM,可以注释curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM');curl_setopt($ch,CURLOPT_SSLKEY,getcwd().'/apiclient_key.pem');curl_setopt($ch,CURLOPT_CAINFO,'PEM');curl_setopt($ch,CURLOPT_CAINFO,getcwd().'/rootca.pem');//第⼆种⽅式,两个⽂件合成⼀个.pem⽂件//curl_setopt($ch,CURLOPT_SSLCERT,getcwd().'/all.pem');if( count($aHeader) >= 1 ){curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader);}curl_setopt($ch,CURLOPT_POST, 1);curl_setopt($ch,CURLOPT_POSTFIELDS,$vars);$data = curl_exec($ch);if($data){curl_close($ch);return $data;}else {$error = curl_errno($ch);echo "call faild, errorCode:$error\n";curl_close($ch);return false;}}/***************************************************** 微信获取AccessToken 返回指定微信公众号的at信息****************************************************/public function wxAccessToken($appId = NULL , $appSecret = NULL){$appId = is_null($appId) ? self::appId : $appId;$appSecret = is_null($appSecret) ? self::appSecret : $appSecret;$data = json_decode(file_get_contents("access_token.json"));if ($data->expire_time < time()) {//echo $appId,$appSecret;$url = "https:///cgi-bin/token?grant_type=client_credential&appid=".$appId."&secret=".$appSecret;$result = $this->wxHttpsRequest($url);//print_r($result);$jsoninfo = json_decode($result, true);$access_token = $jsoninfo["access_token"];if ($access_token) {$data->expire_time = time() + 7000;$data->access_token = $access_token;$fp = fopen("access_token.json", "w");fwrite($fp, json_encode($data));fclose($fp);}}else {$access_token = $data->access_token;}return $access_token;}/***************************************************** 微信获取AccessToken 返回指定微信公众号的at信息****************************************************/public function wxJsApiTicket($appId = NULL , $appSecret = NULL){$appId = is_null($appId) ? self::appId : $appId;$appSecret = is_null($appSecret) ? self::appSecret : $appSecret;$data = json_decode(file_get_contents("jsapi_ticket.json"));if ($data->expire_time < time()) {$url = "https:///cgi-bin/ticket/getticket?type=jsapi&access_token=".$this->wxAccessToken();$result = $this->wxHttpsRequest($url);$jsoninfo = json_decode($result, true);$ticket = $jsoninfo['ticket'];if ($ticket) {$data->expire_time = time() + 7000;$data->jsapi_ticket = $ticket;$fp = fopen("jsapi_ticket.json", "w");fwrite($fp, json_encode($data));fclose($fp);}}else {$ticket = $data->jsapi_ticket;}return $ticket;}/***************************************************** 微信通过OPENID获取⽤户信息,返回数组****************************************************/public function wxGetUser($openId){$wxAccessToken = $this->wxAccessToken();$url = "https:///cgi-bin/user/info?access_token=".$wxAccessToken."&openid=".$openId."&lang=zh_CN"; $result = $this->wxHttpsRequest($url);$jsoninfo = json_decode($result, true);return $jsoninfo;}/***************************************************** 微信⽣成⼆维码ticket****************************************************/public function wxQrCodeTicket($jsonData){$wxAccessToken = $this->wxAccessToken();$url = "https:///cgi-bin/qrcode/create?access_token=".$wxAccessToken;$result = $this->wxHttpsRequest($url,$jsonData);return $result;}/***************************************************** 微信通过ticket⽣成⼆维码****************************************************/public function wxQrCode($ticket){$url = "https:///cgi-bin/showqrcode?ticket=" . urlencode($ticket);return $url;}/***************************************************** 发送⾃定义的模板消息****************************************************/public function wxSetSend($touser, $template_id, $url, $data, $topcolor = '#7B68EE'){$template = array('touser' => $touser,'template_id' => $template_id,'url' => $url,'topcolor' => $topcolor,'data' => $data);$jsonData = json_encode($template);$result = $this->wxSendTemplate($jsonData);return $result;}/***************************************************** 微信设置OAUTH跳转URL,返回字符串信息 - SCOPE = snsapi_base //验证时不返回确认页⾯,只能获取OPENID****************************************************/public function wxOauthBase($redirectUrl,$state = "",$appId = NULL){$appId = is_null($appId) ? self::appId : $appId;$url = "https:///connect/oauth2/authorize?appid=".$appId."&redirect_uri=".$redirectUrl."&response_type=code&scope=snsapi_base&state=".$state."#wechat_redirect"; return $url;}/***************************************************** 微信设置OAUTH跳转URL,返回字符串信息 - SCOPE = snsapi_userinfo //获取⽤户完整信息****************************************************/public function wxOauthUserinfo($redirectUrl,$state = "",$appId = NULL){$appId = is_null($appId) ? self::appId : $appId;$url = "https:///connect/oauth2/authorize?appid=".$appId."&redirect_uri=".$redirectUrl."&response_type=code&scope=snsapi_userinfo&state=".$state."#wechat_redirect"; return $url;}/***************************************************** 微信OAUTH跳转指定URL****************************************************/public function wxHeader($url){header("location:".$url);}/***************************************************** 微信通过OAUTH返回页⾯中获取AT信息****************************************************/public function wxOauthAccessToken($code,$appId = NULL , $appSecret = NULL){$appId = is_null($appId) ? self::appId : $appId;$appSecret = is_null($appSecret) ? self::appSecret : $appSecret;$url = "https:///sns/oauth2/access_token?appid=".$appId."&secret=".$appSecret."&code=".$code."&grant_type=authorization_code";$result = $this->wxHttpsRequest($url);//print_r($result);$jsoninfo = json_decode($result, true);//$access_token = $jsoninfo["access_token"];return $jsoninfo;}/***************************************************** 微信通过OAUTH的Access_Token的信息获取当前⽤户信息 // 只执⾏在snsapi_userinfo模式运⾏****************************************************/public function wxOauthUser($OauthAT,$openId){$url = "https:///sns/userinfo?access_token=".$OauthAT."&openid=".$openId."&lang=zh_CN";$result = $this->wxHttpsRequest($url);$jsoninfo = json_decode($result, true);return $jsoninfo;}/***************************************************** 创建⾃定义菜单****************************************************/public function wxMenuCreate($jsonData){$wxAccessToken = $this->wxAccessToken();$url = "https:///cgi-bin/menu/create?access_token=" . $wxAccessToken;$result = $this->wxHttpsRequest($url,$jsonData);$jsoninfo = json_decode($result, true);return $jsoninfo;}/***************************************************** 获取⾃定义菜单****************************************************/public function wxMenuGet(){$wxAccessToken = $this->wxAccessToken();$url = "https:///cgi-bin/menu/get?access_token=" . $wxAccessToken;$result = $this->wxHttpsRequest($url);$jsoninfo = json_decode($result, true);return $jsoninfo;}/***************************************************** 删除⾃定义菜单****************************************************/public function wxMenuDelete(){$wxAccessToken = $this->wxAccessToken();$url = "https:///cgi-bin/menu/delete?access_token=" . $wxAccessToken;$result = $this->wxHttpsRequest($url);$jsoninfo = json_decode($result, true);return $jsoninfo;}/***************************************************** 获取第三⽅⾃定义菜单****************************************************/public function wxMenuGetInfo(){$wxAccessToken = $this->wxAccessToken();$url = "https:///cgi-bin/get_current_selfmenu_info?access_token=" . $wxAccessToken;$result = $this->wxHttpsRequest($url);$jsoninfo = json_decode($result, true);return $jsoninfo;}/****************************************************** ⽣成随机字符串 - 最长为32位字符串*****************************************************/public function wxNonceStr($length = 16, $type = FALSE) {$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";$str = "";for ($i = 0; $i < $length; $i++) {$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);}if($type == TRUE){return strtoupper(md5(time() . $str));}else {return $str;}}/******************************************************** 微信商户订单号 - 最长28位字符串*******************************************************/public function wxMchBillno($mchid = NULL) {if(is_null($mchid)){if(self::mchid == "" || is_null(self::mchid)){$mchid = time();}else{$mchid = self::mchid;}}else{$mchid = substr(addslashes($mchid),0,10);}return date("Ymd",time()).time().$mchid;}/******************************************************** 微信格式化数组变成参数格式 - ⽀持url加密*******************************************************/public function wxSetParam($parameters){if(is_array($parameters) && !empty($parameters)){$this->parameters = $parameters;return $this->parameters;}else{return array();}}/******************************************************** 微信格式化数组变成参数格式 - ⽀持url加密*******************************************************/public function wxFormatArray($parameters = NULL, $urlencode = FALSE){if(is_null($parameters)){$parameters = $this->parameters;}$restr = "";//初始化空ksort($parameters);//排序参数foreach ($parameters as $k => $v){//循环定制参数if (null != $v && "null" != $v && "sign" != $k) {if($urlencode){//如果参数需要增加URL加密就增加,不需要则不需要$v = urlencode($v);}$restr .= $k . "=" . $v . "&";//返回完整字符串}}if (strlen($restr) > 0) {//如果存在数据则将最后“&”删除$restr = substr($restr, 0, strlen($restr)-1);}return $restr;//返回字符串}/******************************************************** 微信MD5签名⽣成器 - 需要将参数数组转化成为字符串[wxFormatArray⽅法]*******************************************************/public function wxMd5Sign($content, $privatekey){try {if (is_null($privatekey)) {throw new Exception("财付通签名key不能为空!");}if (is_null($content)) {throw new Exception("财付通签名内容不能为空");}$signStr = $content . "&key=" . $privatekey;return strtoupper(md5($signStr));}catch (Exception $e){die($e->getMessage());}}/******************************************************** 微信Sha1签名⽣成器 - 需要将参数数组转化成为字符串[wxFormatArray⽅法]*******************************************************/public function wxSha1Sign($content){try {if (is_null($content)) {throw new Exception("签名内容不能为空");}//$signStr = $content;return sha1($content);}catch (Exception $e){die($e->getMessage());}}/******************************************************** 微信jsApi整合⽅法 - 通过调⽤此⽅法获得jsapi数据*******************************************************/public function wxJsapiPackage(){$jsapi_ticket = $this->wxJsApiTicket();// 注意 URL ⼀定要动态获取,不能 hardcode.$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://"; $url = $protocol.$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];$timestamp = time();$nonceStr = $this->wxNonceStr();$signPackage = array("jsapi_ticket" => $jsapi_ticket,"nonceStr" => $nonceStr,"timestamp" => $timestamp,"url" => $url);// 这⾥参数的顺序要按照 key 值 ASCII 码升序排序$rawString = "jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr×tamp=$timestamp&url=$url";//$rawString = $this->wxFormatArray($signPackage);$signature = $this->wxSha1Sign($rawString);$signPackage['signature'] = $signature;$signPackage['rawString'] = $rawString;$signPackage['appId'] = self::appId;return $signPackage;}/******************************************************** 将数组解析XML - 微信红包接⼝*******************************************************/public function wxArrayToXml($parameters = NULL){if(is_null($parameters)){$parameters = $this->parameters;}if(!is_array($parameters) || empty($parameters)){die("参数不为数组⽆法解析");}$xml = "<xml>";foreach ($arr as $key=>$val){if (is_numeric($val)){$xml.="<".$key.">".$val."</".$key.">";}else$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";}$xml.="</xml>";return $xml;}/******************************************************** 微信卡券:上传LOGO - 需要改写动态功能*******************************************************/public function wxCardUpdateImg() {$wxAccessToken = $this->wxAccessToken();//$data['access_token'] = $wxAccessToken;$data['buffer'] = '@D:\\workspace\\htdocs\\yky_test\\logo.jpg';$url = "https:///cgi-bin/media/uploadimg?access_token=".$wxAccessToken;$result = $this->wxHttpsRequest($url,$data);$jsoninfo = json_decode($result, true);return $jsoninfo;//array(1) { ["url"]=> string(121) "/mmbiz/ibuYxPHqeXePNTW4ATKyias1Cf3zTKiars9PFPzF1k5icvXD7xW0kXUAxHDzkEPd9micCMCN0dcTJfW6Tnm93MiaAfRQ/0" }}/******************************************************** 微信卡券:获取颜⾊*******************************************************/public function wxCardColor(){$wxAccessToken = $this->wxAccessToken();$url = "https:///card/getcolors?access_token=".$wxAccessToken;$result = $this->wxHttpsRequest($url);$jsoninfo = json_decode($result, true);return $jsoninfo;}/******************************************************** 微信卡券:创建卡券*******************************************************/public function wxCardCreated($jsonData) {$wxAccessToken = $this->wxAccessToken();$url = "https:///card/create?access_token=" . $wxAccessToken;$result = $this->wxHttpsRequest($url,$jsonData);$jsoninfo = json_decode($result, true);return $jsoninfo;}/******************************************************** 微信卡券:JSAPI 卡券Package - 基础参数没有附带任何值 - 再⽣产环境中需要根据实际情况进⾏修改*******************************************************/public function wxCardPackage($cardId){$timestamp = time();$api_ticket = $this->wxJsApiTicket();$cardId = $cardId;$arrays = array($api_ticket,$timestamp,$cardId);sort($arrays);$string = sha1(implode("",$arrays));$resultArray['card_id'] = $cardId;$resultArray['card_ext'] = array();$resultArray['card_ext']['openid'] = 'oOmn4s9MiwqHSNNvPn0dBtU23toA';$resultArray['card_ext']['timestamp'] = $timestamp;$resultArray['card_ext']['signature'] = $string;return $resultArray;}}4. [代码]微信JSAPI<?phprequire_once 'lib.inc.php';$wx = new WxApi();//通过⽹页获取openid//if(!isset($_GET['code'])){// header("location:https:///connect/oauth2/authorize?appid=".WxApi::appId."&redirect_uri=http://".$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF']."&response_type=code&scope=snsapi_base&state=1#wechat_redirect"); //}//else{// $CODE = $_GET['code'];// $Info = $wx->wxOauthAccessToken($CODE);//print_r($Info);// $openId = $Info['openid'];//}////////////////////////////////////////////$signPackage = $wx->wxJsapiPackage();//print_r($signPackage);$kqInfo = $wx->wxCardPackage("");$listInfo = $wx->wxCardListPackage();><html><head><title>JSAPI接⼝测试</title><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="/jquery-1.11.2.min.js"></script><script src="/open/js/jweixin-1.0.0.js"></script></head><body><div><input type="button" id="batchAddCard" name="batchAddCard" value="添加卡券" /><br /><input type="button" id="openCard" name="openCard" value="拉起卡券库" /><br /><input type="button" id="ShareTimeLine" name="ShareTimeLine" value="分享朋友圈" /><br /><div id="showInfo"></div></div><script>wx.config({debug: false,appId: '<?php echo $signPackage["appId"];?>',timestamp: <?php echo $signPackage["timestamp"];?>,nonceStr: '<?php echo $signPackage["nonceStr"];?>',signature: '<?php echo $signPackage["signature"];?>',jsApiList: [// 所有要调⽤的 API 都要加到这个列表中'onMenuShareTimeline','onMenuShareAppMessage','addCard','openCard']});wx.ready(function () {// 在这⾥调⽤ APIwx.onMenuShareAppMessage({title: '互联⽹之⼦',desc: '在长⼤的过程中,我才慢慢发现,我⾝边的所有事,别⼈跟我说的所有事,那些所谓本来如此,注定如此的事,它们其实没有⾮得如此,事情是可以改变的。
详解微信开发9大新接口
可以说掌握了这些微信最新接口,企业在个性、精准服务和互动交流上无疑将更加出彩。
下面一起来看看这些高级接口开放背后的意义和可以延伸的用法。
1. 语音识别描述:通过语音识别接口,用户发送的语音,微信后台将同时给出语音识别出的文本内容。
意义:第三方可以调用微信自主研发的语音识别技术,将用户语音发送的信息自动识别为文字,以便于系统快速处理需求。
依靠微信强大的语音识别技术,企业在公众平台操作时间大大减少,显著提升企业在公众平台上的运营效率,及时对用户的反馈提供支持。
例如在空调的“语音识别”功能,用户可以通过语音来告诉微信需要的温度、风速、模式等,通过语音识别后微信就会自动向空调发出指令来进行相应的调节。
同样,未来电视也能动动嘴就搜节目,直接通过语音搜索“告诉”微信想看的节目就能自动调台,解决了遥控器难以文字输入的弱点。
语音识别便于系统快速处理需求,提升企业在公众平台上的运营效率,及时对用户的反馈提供支持。
2. 客服接口描述:通过客服接口,公众号可以在用户发送过消息的 24 小时内,向用户回复消息。
意义:过去的公众帐号与订户之间只能被动响应,用户触发了需求,如发送关键字给公众帐号,后者才可以与用户对话。
如今,如果订户跟公众帐号对话过一次,公众帐号就可以在 24 个小时内给用户下发消息,这提高了公众帐号发送消息的能力。
有了它,相当于为企业配置了一个高效的自动回复机器人,为企业的客户服务方式提供了更多的想象空间。
3.OAuth2.0 网页授权描述:通过网页授权接口,公众号可以请求用户授权。
意义:类似微博、QQ的帐号授权功能,意味着微信帐号也将正式成为一个帐号系统。
在 OAuth2.0接口的支援下,可做到微信用户状态保持、信息拉取(昵称、性别、地区等),真正实现微网站用户免注册。
企业相当于新增一个微型平台,在这上面,企业可以直白地了解用户的各类信息,开展自身服务。
4. 生成带参数二维码描述:通过该接口,公众号可以获得一系列携带不同参数的二维码,在用户扫描关注公众号后,公众号可以根据参数分析各二维码的效果。
微信获取用户信息的两个接口和两个ACCESS_TOKEN
微信获取⽤户信息的两个接⼝和两个ACCESS_TOKEN
有⼀段时间没有搞微信开发了,今天突然要改⼀下程序!回头⼀看微信的帮助⽂档太tm的稀烂的,太难懂了,这做个笔记以后看着⽅便微信有2个ACCESS_TOKEN,
1,基础接⼝的token 获取接⼝是
https:///cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
2,⽤户⽹页授权access_token 获取接⼝地址是
⽹页授权access_token 需要通过code去获取
code是怎么来的,是通过调⽤下⾯接⼝来获取的
注意这个接⼝中有个参数scope 默认有2个值snsapi_base和snsapi_userinfo,这个接⼝会根据scope 来⽣成不同的code并且获取不同作⽤的access_token ,不管scope传什么值都能在得到对应access_token的同时得到open_id,如果你只需要得到opend_id 那使⽤snsapi_base 参数到此结束了,如果需要获取⽤户的其他信息⽐如昵称地址就要snsapi_userinfo 会弹出授权
3 怎么获取⽤户信息那就调⽤下⾯接⼝
很明显这个接⼝中的access_token是第⼆步获取code的时候scope 参数传snsapi_userinfo来换取的access_token
4 微信还有⼀个获取⽤户基本信息的接⼝但是这个接⼝需要你关注了公众号
微信的解释:是在⽤户和公众号产⽣消息交互或关注后事件推送后,才能根据⽤户OpenID来获取⽤户基本信息。
这个接⼝,包括其他微信接⼝,都是需要该⽤户(即openid)关注了公众号后,才能调⽤成功的。
微信公众平台各大接口详细功能演示与实现
一、用户管理
2.获取用户信息
access_token 返回值为json 与用户的 数据,如: openId获取用户信息
一、用户管理
3.获取关注者列表
通过 公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串 返回数据 https:///cgi-bin/user/get?access_token=ACCESS_TOKEN OpenID url ,即原 (加密后的微信号,每个用户对每个公众号的 url 去掉next_openid这项,得到的json数据拥有 OpenID "next_openid", 是唯一的)组 如: 成。一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取 的方式来满足需求。
json请求格式:
查询用户组所在分组
通过用户的OpenID查询其所在的GroupID。
openid为用户ID,用户关注或者发送消息时 <FromUserName></FromUserName>中的数据
修改分组名
通过分组查询中得到的groupId可以修改分组名 返回值,成功或失败
移动用户分组
通过用户的 openid和分组id修改 返回值,成功或失败
2、自定义菜单查询
接口链接: https:///cgibin/menu/get?access_token=ACCESS_TOKEN 返回格式:
微信接口说明
推广支持 生成带参数的二维码
JS接口
隐藏微信中网页右上角按
钮 隐藏微信中网页底部导航
栏 网页获取用户网络状态
备注 申请成为开发者时填写的验证开发者的URL 可接收:1.文本 2.图片 3.语音 4.视频 5.地理位置 6.链接 消息 可接收:1.关注/取消关注事件2.扫描带参数二维码事件 3.上报地理位置事件 4.自定义菜单事件 开通语音识别功能,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一 个Recongnition字段。
可生成临时二维码和永久二维码Байду номын сангаас开发者设置场景参数)
1.创建分组 2.查询所有分组 3.查询用户所在分组 4.修改分组名 5.移动用户分组(这个接口功能大 多可以在微信平台页面完成) 获取用户:昵称、头像、性别、所在城市、语言和关注时间 获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的 OpenID是唯一的)组成。 先让用户确认是否允许公众号使用其地理位置。如果允许则获得用户经度/纬度和地理位置精度 如果用户在微信中(Web微信除外)访问公众号的第三方网页,公众号开发者可以通过此接口获取当 前用户基本信息(包括昵称、性别、城市、国家)。 JS接口。方便开发者根据用户的网络状态来提供不同质量的服务
根据请求,返回特定消息(支持回复文本、图片、图文、语音、视频、音乐) 用户主动发消息时,微信将会把消息数据推送给开发者,开发者24小时内可以调用客服消息接口,发 送消息。主要用于人工客服等。
创建自定义菜单 查询自定义菜单 删除自定义菜单 用户点击自定义菜单后,如果菜单按钮设置为click类型,则微信会把此次点击事件推送给开发者。
分类 接收消息
【C#版本】微信公众号模板消息对接(二)(图文详解)
【C#版本】微信公众号模板消息对接(⼆)(图⽂详解)本篇⽂章承接上⼀篇⽂章内容,特此说明:本篇⽂章为个⼈原创⽂章,创作不易,未经作者本⼈同意、许可等条件,不得以任何形式搬运、转载、抄袭(等包括但不限于上述⼿段)本⽂章,否则保留追究有关侵权⼈责任的权利。
⼀、⽹页授权业务设计可能会有⼩伙伴要说了,咱不是讲解微信模板消息的开发嘛?怎么⼜扯到⽹页授权开发了?你这不是跑题了吗?然⽽事实并⾮如此,且听我慢慢细细道来。
第1步:当我们(“消息推送者”)要给某位公众号关注者(“消息接收者”、“消息被推送者”)推送⼀条消息时,我们必须要先知道这位公众号关注者的唯⼀且正确的信息(OpenID 或者UnionID)后才能推送消息(例如:就像你给某⼈打电话时必须先知道TA的正确的电话号码,不然你怎么确定你输⼊的号码就是你想打给电话的那个⼈,是⼀样的道理),防⽌消息推送给错误的公众号关注者。
即该消息的消息接收者正是我们要推送的消息的消息被推送者。
第2步:假设我们已经获取到公众号关注者的唯⼀且正确的信息,然⽽获取到的上述信息不包含公众号关注者的特征信息,实际上就是⼀串⽆任何含义的字符串,⽆法知道这条唯⼀且正确的信息对应我们业务系统中的哪位⽤户,也有可能这位公众号关注者还未在我们业务系统中注册过账号。
第3步:我们需要在微信公众号中设计⼀个信息双向绑定的业务需求。
在这个页⾯中,我们不仅要获取到公众号关注者的唯⼀且正确的信息,还需要公众号关注者主动提供并填写在我们业务系统中⽤户主动填写的⾃⾝的具有唯⼀区分性的信息(例如:⼿机号、邮箱号等信息)。
这样⼀来,通过中间桥梁信息(⼿机号、邮箱号等信息)就能把公众号关注者的唯⼀且正确的信息与我们业务系统中⽤户表⾥的唯⼀信息(假设是uid)进⾏绑定。
即:我们就能把⽤户在我们公众号的唯⼀且正确的信息与我们业务系统中⽤户表⾥的唯⼀信息进⾏⼀⼀对应,形成信息双向绑定关系。
如果公众号关注者主动提供的信息在我们业务系统的⽤户表⾥不存在,还需要设计⽤户注册等业务需求,注册成功后再进⾏信息双向绑定。
C#微信接口之推送模板消息功能示例
C#微信接⼝之推送模板消息功能⽰例本⽂实例讲述了C#微信接⼝之推送模板消息功能。
分享给⼤家供⼤家参考,具体如下:public string SendTempletMessge(){string strReturn = string.Empty;try{#region 获取access_tokenstring apiurl = "https:///cgi-bin/token?grant_type=client_credential&appid=你的appid&secret=你的secret"; WebRequest request = WebRequest.Create(@apiurl);request.Method = "POST";WebResponse response = request.GetResponse();Stream stream = response.GetResponseStream();Encoding encode = Encoding.UTF8;StreamReader reader = new StreamReader(stream, encode);string detail = reader.ReadToEnd();var jd = JsonConvert.DeserializeObject<WXApi>(detail);string token = (String)jd.access_token;#endregion#region 组装信息推送,并返回结果(其它模版消息于此类似)string url = "https:///cgi-bin/message/template/send?access_token=" + token;string temp = "{\"touser\": \"" + UserInfo.OpenID + "\"," +"\"template_id\": \"f3kRRjJeyLDf4tndtg-OJeRvgEdgjjDxCy4T9kuwM70\", " +"\"topcolor\": \"#FF0000\", " +"\"data\": " +"{\"first\": {\"value\": \"您好,您有⼀条回款通知信息\"}," +"\"keyword1\": { \"value\": \"单位名称\"}," +"\"keyword2\": { \"value\": \"⽇期\"}," +"\"keyword3\": { \"value\": \"⾦额\"}," +"\"keyword4\": { \"value\": \"业务员\"}," +"\"remark\": {\"value\": \"\" }}}";#endregion//核⼼代码GetResponseData(temp, @url);strReturn = "推送成功";}catch (Exception ex){strReturn = ex.Message;}return strReturn;}/// <summary>/// 返回JSon数据/// </summary>/// <param name="JSONData">要处理的JSON数据</param>/// <param name="Url">要提交的URL</param>/// <returns>返回的JSON处理字符串</returns>public string GetResponseData(string JSONData, string Url){byte[] bytes = Encoding.UTF8.GetBytes(JSONData);HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);request.Method = "POST";request.ContentLength = bytes.Length;request.ContentType = "json";Stream reqstream = request.GetRequestStream();reqstream.Write(bytes, 0, bytes.Length);//声明⼀个HttpWebRequest请求request.Timeout = 90000;//设置连接超时时间request.Headers.Set("Pragma", "no-cache");HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream streamReceive = response.GetResponseStream();Encoding encoding = Encoding.UTF8;StreamReader streamReader = new StreamReader(streamReceive, encoding);string strResult = streamReader.ReadToEnd();streamReceive.Dispose();streamReader.Dispose();return strResult;}涉及到的实体:public class WXApi{public string access_token { set; get; }}更多关于C#相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》及《》希望本⽂所述对⼤家C#程序设计有所帮助。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微信消息接口指南出自开放平台跳转到:导航, 搜索目录[隐藏]∙ 1 简介∙ 2 申请消息接口∙ 3 网址接入∙ 4 消息推送o 4.1 文本消息o 4.2 图片消息o 4.3 地理位置消息o 4.4 链接消息o 4.5 事件推送∙ 5 消息回复o 5.1 回复文本消息o 5.2 回复音乐消息o 5.3 回复图文消息∙ 6 注意事项∙7 示例代码简介公众平台消息接口为开发者提供了一种新的消息处理方式。
申请消息接口点击申请,填写网址url和token,其中token可由开发者可以任意填写,用作生成签名。
网址接入公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:开发者通过检验signature对请求进行校验(下面有校验方式)。
若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce 参数。
加密/校验流程:1. 将token、timestamp、nonce三个参数进行字典序排序2. 将三个参数字符串拼接成一个字符串进行sha1加密3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信消息推送当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL 上。
结构如下:文本消息<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><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[this is a url]></PicUrl><MsgId>1234567890123456</MsgId>地理位置消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1351776360</CreateTime><MsgType><![CDATA[location]]></MsgType><Location_X>23.134521</Location_X><Location_Y>113.358803</Location_Y><Scale>20</Scale><Label><![CDATA[位置信息]]></Label><MsgId>1234567890123456</MsgId>链接消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>1351776360</CreateTime><MsgType><![CDATA[link]]></MsgType><Title><![CDATA[公众平台官网链接]]></Title><Description><![CDATA[公众平台官网链接]]></Description> <Url><![CDATA[url]]></Url><MsgId>1234567890123456</MsgId>事件推送事件推送只支持微信4.5版本,即将开放,敬请期待。
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>123456789</CreateTime><MsgType><![CDATA[event]]></MsgType><Event><![CDATA[LOCATION]]></Event><Latitude>23.137466</Latitude><Longitude>113.352425</Longitude><Precision>119.385040</Precision>消息回复对于每一个POST请求,开发者在响应包中返回特定xml结构,对该消息进行响应(现支持回复文本、图文、语音、视频、音乐和对收到的消息进行星标操作)。
微信服务器在五秒内收不到响应会断掉连接。
回复xml结构如下:回复文本消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[content]]></Content><FuncFlag>0</FuncFlag>回复音乐消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[TITLE]]></Title><Description><![CDATA[DESCRIPTION]]></Description> <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl><HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl> </Music><FuncFlag>0</FuncFlag>回复图文消息<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>12345678</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>2</ArticleCount><Articles><item><Title><![CDATA[title1]]></Title><Description><![CDATA[description1]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item><item><Title><![CDATA[title]]></Title><Description><![CDATA[description]]></Description> <PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item></Articles><FuncFlag>1</FuncFlag>注意事项1.用户OpenID对一个公众号是固定唯一的串2.请使用80端口3.用户关注公众号,微信公众平台服务器推送一条内容为Hello2BizUser的文本消息到第三方服务器示例代码PHP:下载。