2019-09-02 19:52:34 weixin_44475427 阅读数 189
  • 微信开发群发图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8122 人正在学习 去看看 秦子恒

简述:在写网页授权之前,本人并没有接触过公众号的开发,因此走了很多弯路。
1、首先是获取code,在获取code上就花了较长的时间虽然说是跟着开发文档来的(公众号开发文档),但是依旧遇见了很多问题。
第一步:调微信的接口;原本以为是一个get请求,最后才知道是通过window.location.href调的接口,(redirect_uri必须编码)
由于授权操作安全等级较高,所以在发起授权请求时,微信会对授权链接做正则强匹配校验,如果链接的参数顺序不对,授权页面将无法正常访问

  • window.location.href="https://open.weixin.qq.com/connect/oauth2/authorize?appId=wx077effbe10123456 &redirect_uri="+encodeURIComponent(window.location.href)+"&response_type=code&scope=snsapi_userinfo&connect_redirect=1#wechat_redirect"
    

但即使是这一步,我便遇到了问题;首先是习惯性的在浏览器上打开然后提示到微信客户端,
在微信开发工具中调试地址一栏输入你所要跳转到的页面以及所携带的参数(http://card.com/?id=123456),然后就出现了

  • redirect_uri参数错误,后经查是后端那边没有配置回调域名,本以为就这样能走通,结果还是报参数错误。(当时由于是周六晚上就留到了周一解决)但是再一次调试时却遇到 redirect_uri多次重定向,且依旧出现参数错误;

  • 多次重定向是因为在页面渲染完成后调用了微信的接口,在调取成功后跳回原来的页面(http://card.com/?id=123456);然后页面再次渲染,再次调了微信的接口,解决方法就是在调用该方法时做判断

  • getAut(){ let _this=this; if(_this.$route.query.id){ if(!window.location.href.includes('code=')){ window.location.href="https://open.weixin.qq.com/connect/oauth2/authorize?appId=wx077effbe10156931&redirect_uri="+encodeURIComponent(window.location.href)+"&response_type=code&scope=snsapi_userinfo&connect_redirect=1#wechat_redirect" } _this.getMarketId(); _this.$nextTick(()=>{ let firstIdx=window.location.href.indexOf('code='); let secondIdx=window.location.href.indexOf('&',firstIdx) let params={ code:window.location.href.slice(firstIdx+5,secondIdx) } fetchGet('http://card.com/admin/get_open_id',params).then(res=>{ if(res.status==1){ // _this.$toast.success(res.msg) _this.getInfo(); }else{ _this.$toast.fail(res.msg) } }) }) }else{ _this.getId();//获取url上的参数id(该方法未贴出) _this.getInfo();//获取当前页的信息(该方法未贴出) } }

2015-05-12 17:02:33 xb12369 阅读数 12042
  • 微信开发群发图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8122 人正在学习 去看看 秦子恒

第一步:填写服务器配置

兵车未动,粮草先行,首先你得有台服务器,80端口未被占用~

想必这里的api大家都看过的


说明:URL填写你服务器80端口的URL,比如楼主的是(http://******/weixinTest.jspx),这里还需要与微信握手,以确保次连接有效;

            Token数字和英文组成的字符串,最大长度为32字符,比如楼主的是xb12369;

            EncodingAESKey直接用后面的随机生成,到目前为止还没用用到这个;


第二步:验证服务器地址的有效性


刚才也说过,微信会校验你的URL是否有效,那么接下来开始正式握手!!!



说明:1,字典排序

ArrayList list = new ArrayList();
				list.add(token);
				list.add(timestamp);
				list.add(nonce);

				Collections.sort(list, new SpellComparator());


/**
	 * 汉字拼音排序比较器
	 */
	static class SpellComparator implements Comparator{
		public int compare(Object o1, Object o2) {
			try {
				// 取得比较对象的汉字编码,并将其转换成字符串
				String s1 = new String(o1.toString().getBytes("GB2312"), "ISO-8859-1");
				String s2 = new String(o2.toString().getBytes("GB2312"), "ISO-8859-1");
				// 运用String类的 compareTo()方法对两对象进行比较
				return s1.compareTo(s2);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return 0;
		}
	}


2,sha1加密,关于这种加密,百度一下到处都是

//将三个参数字符串拼接成一个字符串进行sha1加密
				String digest = new SHA1Utils().getDigestOfString(temp.getBytes());


3,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

之前就一直卡在这里,没有搞清楚啥叫原样返回,后面终于弄明白了,然来是要printwriter到微信

if(digest.equalsIgnoreCase(signature)){
					try{
						System.out.println("我成功了~~~~");
						//开发者通过检验signature对请求进行校验(下面有校验方式)。
						//若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

						PrintWriter out = response.getWriter();
						out.print(echostr);
						out.flush();
						out.close();

						System.out.println("这次你再改成功改了吧~~~");
					}catch (Exception e) {
						e.printStackTrace();
					}
				}else{
					System.out.println("sha1加密后:" +digest+ "微信返回的是:"+signature);
				}

部分代码如下,仅供参考:



认证通过后,微信公共平台将会得到一个AppID,AppSecret,有了这两个你就可以往下高更深入的东西了!!!

2018-09-21 20:19:44 tongtongsong 阅读数 960
  • 微信开发群发图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8122 人正在学习 去看看 秦子恒

今天整了好长时间一直报 code=40001  原因是:获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口

唉!心累

原来官方在开发文档中就表明了 :

官方也提供了非常好用的获取access_token工具

开心 ! 给大家再演示一番

安全起见 凑合看吧   ?   

2018-06-25 11:14:11 qq_35568099 阅读数 176
  • 微信开发群发图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8122 人正在学习 去看看 秦子恒

1.缓存 (时间很长)

2.获取用户权限 拿去code 接口

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 

redirect_uri 为要重定向的路径.也可拼接参数.但是变量名不能叫path 否则重定向的接口会从path后面截取.

本人为菜鸟若有错误或者意见还请微微大佬多多指教

2018-05-21 20:01:45 m0_37937502 阅读数 2629
  • 微信开发群发图文消息-微信开发16(PHP)

    会员免费看,http://edu.csdn.net/lecturer/842 右侧可办理会员卡。微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入多个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎反馈,微信号:QQ68183131

    8122 人正在学习 去看看 秦子恒

执行流程

这里写图片描述

1.打开页面后,向服务器发送一个get请求,服务器会返回一个uuid

2.凭借这个uuid就可以获得用于登录的二维码

3.在获取到二维码和用户扫描二维码并确认登录之间,客户端会每隔一段时间向服务器发送一个get请求来查看这个二维码是否被扫描。如果二维码被扫描,返回window.code=201;,否则返回window.code=408;。如果这个二维码长时间没有被扫描,那么这个二维码就会失效。另外,如果二维码被扫描了,但是用户一直没有在手机上点确定登录,那么一段时间后,服务器也会返回window.code=408;。一旦用户点了确定登录,那么服务器就会返回window.code=200;

4.登录后,客户端会向服务器请求到cookiepass_ticket这类东西用来标识用户。

5.客户端就凭借着上面这些东西向服务器请求用户信息和联系人列表。

6.接着,客户端开启状态通知,每隔一段时间就向服务器发送请求,以此来确定客户端当前状态,比如是否有新的消息或者用户已经登出了微信。

具体分析

获得uuid

API 获取uuid
url =xxx”>https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage&fun=new&lang=zh_CN&=xxx
method get
说明 _:时间戳

响应:

window.QRLogin.code = 200; window.QRLogin.uuid = "xxx";

获得二维码

API 获得二维码
url https://login.weixin.qq.com/qrcode/uuid
method get
说明 uuid即为上面获得的uuid

检查二维码扫描状态

API 检查二维码扫描状态
url =xxx”>https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=xxx&tip=1&r=xxx&=xxx
method get
说明 _r好像都是时间戳,不过不发r好像也没关系

响应:

//二维码未被扫描或者二维码被扫描但用户长时间未点击确认登录时
window.code=408;

//二维码被扫描时
window.code=201;window.userAvatar = 'xxx';

//用户点击确认登录时
window.code=200;
window.redirect_uri="xxx";

登录获取cookie

API 登录获取cookie
url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=xxx&uuid=xxx&lang=zh_CN&scan=xxx&fun=new&version=v2&lang=zh_CN
method get
说明 ticket scanwindow.redirect_uri="xxx";里面

响应:

<error>
    <ret>0</ret>
    <message>OK</message>
    <skey>xxx</skey>
    <wxsid>xxx</wxsid>
    <wxuin>xxx</wxuin>
    <pass_ticket>xxx</pass_ticket>
    <isgrayscale>1</isgrayscale>
</error>

初始化

API 初始化
url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=xxx&pass_ticket=xxx
method post
params {"BaseRequest":{"Uin":"xxx","Sid":"xxx","Skey":"xxx","DeviceID":"xxx"}}
请求头 Content-Type application/json;charset=utf-8
说明 DeviceID是e后面跟着一个15字节的随机数,例:e159973572418266

响应:

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    "Count": 11,
    "ContactList": [...],
    "SyncKey": {
        "Count": 4,
        "List": [
            {
                "Key": 1,
                "Val": 635705559
            },
            ...
        ]
    },
    "User": {
        "Uin": xxx,
        "UserName": xxx,
        "NickName": xxx,
        "HeadImgUrl": xxx,
        "RemarkName": "",
        "PYInitial": "",
        "PYQuanPin": "",
        "RemarkPYInitial": "",
        "RemarkPYQuanPin": "",
        "HideInputBarFlag": 0,
        "StarFriend": 0,
        "Sex": 1,
        "Signature": "Apt-get install B",
        "AppAccountFlag": 0,
        "VerifyFlag": 0,
        "ContactFlag": 0,
        "WebWxPluginSwitch": 0,
        "HeadImgFlag": 1,
        "SnsFlag": 17
    },
    "ChatSet": xxx,
    "SKey": xxx,
    "ClientVersion": 369297683,
    "SystemTime": 1453124908,
    "GrayScale": 1,
    "InviteStartCount": 40,
    "MPSubscribeMsgCount": 2,
    "MPSubscribeMsgList": [...],
    "ClickReportInterval": 600000
}

开启状态通知

API 开启状态通知
url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify?pass_ticket=xxx
method post
请求头 Content-Type:application/json;charset=utf-8

params:

{
  "BaseRequest": 
  {
    "Uin": "xxx",
    "Sid": "xxx",
    "Skey": "xxx",
    "DeviceID": "xxx"
  },
  "ClientMsgId": "时间戳",
  "Code": 3,
  "FromUserName": "自己的ID",
  "ToUserName": "自己的ID"
}

响应:

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    "MsgID":xxx
}

获取联系人信息

API 获取联系人信息
url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?pass_ticket=xxx&r=xxx&seq=0&skey=xxx
method get

响应:

{
    "BaseResponse": {
        "Ret": 0,
        "ErrMsg": ""
    },
    "MemberCount": 334,
    "MemberList": [
        {
            "Uin": 0,
            "UserName": xxx,
            "NickName": "Urinx",
            "HeadImgUrl": xxx,
            "ContactFlag": 3,
            "MemberCount": 0,
            "MemberList": [],
            "RemarkName": "",
            "HideInputBarFlag": 0,
            "Sex": 0,
            "Signature": "xxx",
            "VerifyFlag": 8,
            "OwnerUin": 0,
            "PYInitial": "URINX",
            "PYQuanPin": "Urinx",
            "RemarkPYInitial": "",
            "RemarkPYQuanPin": "",
            "StarFriend": 0,
            "AppAccountFlag": 0,
            "Statues": 0,
            "AttrStatus": 0,
            "Province": "",
            "City": "",
            "Alias": "Urinxs",
            "SnsFlag": 0,
            "UniFriend": 0,
            "DisplayName": "",
            "ChatRoomId": 0,
            "KeyWord": "gh_",
            "EncryChatRoomId": ""
        },
        ...
    ],
    "Seq": 0
}
API 获取联系人信息
url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=xxx0&pass_ticket=xxx
method post
请求头 Content-Type:application/json;charset=utf-8
说明 UserName是要查询具体信息的用户名,EncryChatRoomId是该用户所属的群用户名。

params:

  {
    "BaseRequest": {
    "Uin": "xxx",
    "Sid": "xxx",
    "Skey": "xxx",
    "DeviceID": "xxx"
    },
    "Count":xx,
    "List":{
      0:{
        "EncryChatRoomId":
        "UserName":"xxx"
      },
      ...
    }
  }

这两种方法的区别在于webwxbatchgetcontact返回的数据中会有群成员信息

心跳检查

API 心跳检查
url =xxx”>https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck?r=xxx&skey=xxx&sid=xxx&deviceid=xxx&synckey=xxx&=xxx
method get

要把初始化中得到的SyncKey整理成key_val|key_val这种格式,例如:1_694411380|2_694413141|3_694412799|1000_1526698782

响应(String):

window.synccheck={retcode:"xxx",selector:"xxx"}

retcode:
    0 正常
    1100 失败/登出微信
selector:
    0 正常
    2 新的消息
    7 进入/离开聊天界面

获取最新消息

API 获取最新消息
url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=xxx&skey=xxx&lang=zh_CN&pass_ticket=xxx
method post
请求头 Content-Type:application/json;charset=utf-8
说明 rr:时间戳取反。

params:

{
    "BaseRequest": {
    "Uin": "xxx",
    "Sid": "xxx",
    "Skey": "xxx",
    "DeviceID": "xxx"
    },
    "rr":xx,
    "SyncKey":{
      "Count":xx,
      "List":{
        0:{
          "Key":xx
          "Val":xx
        },
        ...
      }
    }
  }

响应:

BaseResponse
AddMsgCount:新增消息数
AddMsgList:新增消息列表
ModContactCount: 变更联系人数目
ModContactList: 变更联系人列表
SyncKey:新的synckey列表

当webwxsync发送完后会发送一个syncheck请求向服务器表示webwxsync响应已经收到了,这时syncheck用的synckey是发送webwxsync时收到的。若synccheck返回为window.synccheck={retcode:"0",selector:"0"},则继续发出相同请求。若返回不为以上返回值,继续POST请求webwxsync。

发送消息

API 发送消息
url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?lang=zh_CN&pass_ticket=xxx
method post
请求头 Content-Type:application/json;charset=utf-8

params:

{
  "BaseRequest": {
    "Uin": "xxx",
    "Sid": "xxx",
    "Skey": "xxx",
    "DeviceID": "xxx"
  },
  "Msg":{
    "Type": 1 文字消息, 
    "Content": 要发送的消息, 
    "FromUserName": 自己的ID, 
    "ToUserName": 好友的ID, 
    "LocalID": 与clientMsgId相同, 
    "ClientMsgId": 时间戳左移4位随后补上4位随机数 
  },
  "Scene": 0
}

响应:

{
"BaseResponse": {
"Ret": 0,
"ErrMsg": ""
}
,
"MsgID": "xxx",
"LocalID": "xxx"
}

参考文章/项目

小程序整理杂篇

阅读数 573

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