精华内容
下载资源
问答
  • 微信二次开发接口

    2019-11-08 14:01:48
    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页...

    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页个人微信api分享,微信机器人SDK接口API,个人微信号API接口,微信群API接口

    1、基础消息类型
    1、客户端发送的心跳包HeartBeatReq = 1001; 
    2、消息接收确认回复(接收或拒绝接收)MsgReceivedAck = 1002; 
    3、错误单独提升为一种消息类型Error = 1003; 
    4、通用任务执行结果通知TaskResultNotice = 1025; 
    2、设备客户端授权类消息
    1、设备(手机客户端、客服客户端)获取通信token请求与响应DeviceAuthReq = 1010; 
    设备(手机客户端、客服客户端)获取通信token响应DeviceAuthRsp = 1011;
    2、设备授权后退出(仅用于服务端内部)DeviceExitNotice = 1012; 
    3、账号强制下线通知 AccountForceOfflineNotice = 1013; 
    3、手机客户端上传的通知类消息
    1、手机客户端微信上线通知 WeChatOnlineNotice = 1020; 
    2、手机客户端微信下线通知 WeChatOfflineNotice = 1021; 
    3、微信个人号新增好友通知FriendAddNotice = 1022;
    4、微信个人号移除好友通知FriendDelNotice = 1023; 
    5、微信好友发来聊天消息通知FriendTalkNotice = 1024; 
    6、手机上回复好友的聊天消息通知WeChatTalkToFriendNotice = 1026; 
    7、有好友请求添加好友的通知FriendAddReqeustNotice = 1027; 
    8、手机上发送了朋友圈通知CircleNewPublishNotice = 1031; 
    9、手机上删除朋友圈返回通知CircleDelNotice = 1032; 
    10、手机检测到有人点赞/取消点赞通知CircleLikeNotice = 1033; 
    11、手机检测到有人评论/删除朋友圈通知CircleCommentNotice = 1034; 
    12、消息标记为已读PostMessageReadNotice = 1035; 
    13、群聊新增通知ChatRoomAddNotice = 1037; 
    14、群聊信息变更通知ChatRoomChangedNotice = 1042;
    15、群聊删除通知返回ChatRoomDelNotice = 1041; 
    16、联系人标签新增,修改通知ContactLabelAddNotice = 1038; 
    17、联系人标签删除通知ContactLabelDelNotice = 1044; // 联系人标签删除通知
    18、新增公众号通知BizContactAddNotice = 2038; // 新增公众号通知
    19、手机端推送当前sdk的安装版本通知PostDeviceInfoNotice = 2027; 
    4、服务端、客服客户端发给设备的指令类消息(sdk咨询微信836869520)
    1、给好友发消息任务TalkToFriendTask = 1070; 
    返回聊天执行结果TalkToFriendTaskResultNotice = 1028; 
    2、发送朋友圈任务及结果返回PostSNSNewsTask = 1071; 
    返回发送朋友圈数据结果PostSNSNewsTaskResultNotice = 1073; 
    3、删除朋友圈任务与结果返回DeleteSNSNewsTask = 1074; 
    返回通用任务执行结果
    4、主动添加好友任务及返回结果AddFriendsTask = 1072; 
    返回通用任务执行结果
    5、接受好友请求任务及返回结果AcceptFriendAddRequestTask = 1075; 
    返回通用任务执行结果
    6、群发消息任务WeChatGroupSendTask = 1076; 
    返回通用任务执行结果
    7、执行养号动作命令任务WeChatMaintenanceTask = 1077; 
    返回通用任务执行结果
    8、养号任务停止任务及返回结果PostStopWeChatMaintenanceTask = 1100; 
    返回通用任务执行结果
    9、清粉任务及返回结果PostFriendDetectTask = 1095; 
    返回:每隔一段时间手机端回传检测清粉好友数PostFriendDetectCountNotice = 2028; 
    10、终止清粉任务及返回结果PostStopFriendDetectTask = 1096; 
    返回通用任务执行结果
    11、请求聊天图片或视频消息的详细内容任务与结果返回RequestTalkDetailTask = 1078; 
    返回聊天图片或视频消息的详细内容结果RequestTalkDetailTaskResultNotice = 1029; 
    12、要求手机上传当前微信二维码任务及返回PullWeChatQrCodeTask = 1079; 
    返回手机端微信的二维码PullWeChatQrCodeTaskResultNotice = 1030; 
    13、触发手机推送好友列表任务及结果返回TriggerFriendPushTask = 1080; 
    返回一:手机端推送好友列表(分页,每页100)FriendPushNotice = 2026;
    返回二:手机端推送标签列表
    14、触发手机推送朋友圈列表任务及结果返回TriggerCirclePushTask = 1081; 
    返回手机朋友圈数据(分页,每页20)CirclePushNotice = 2029; 
    15、朋友圈评论删除任务及结果返回CircleCommentDeleteTask = 1082; 
    朋友圈评论删除任务反馈 CircleCommentDeleteTaskResultNotice = 1083; 
    16、朋友圈评论回复任务及结果返回CircleCommentReplyTask = 1084; 
    朋友圈评论回复反馈CircleCommentReplyTaskResultNotice = 1085; 
    17、通知手机将某个聊天窗口置为已读TriggerMessageReadTask = 1086; 
    无返回
    18、消息撤回任务RevokeMessageTask = 1087; 
    返回通用任务执行结果
    19、转发消息任务ForwardMessageTask = 1088;
    返回通用任务执行结果
    20、通知手机推送历史聊天记录任务及返回TriggerHistoryMsgPushTask = 1089; 
    返回历史消息(分页,每页50)HistoryMsgPushNotice = 2033; 
    21、获取群聊二维码任务及结果返回PullChatRoomQrCodeTask = 1090; 
    返回群二维码PullChatRoomQrCodeTaskResultNotice = 1043;
    22、朋友圈点赞任务及结果返回PostMomentsPraiseTask = 1098; 
    返回朋友圈点赞数量PostMomentsPraiseCountNotice = 2030; 
    23、停止朋友圈点赞任务PostStopMomentsPraiseTask = 1099; 
    返回通用任务执行结果
    24、修改联系人备注任务ModifyFriendMemoTask = 1101; 
    返回通用任务执行结果
    25、领取红包或转账收钱任务及返回TakeLuckyMoneyTask = 1200; 
    返回收钱任务执行结果TakeMoneyTaskResultNotice = 1039; 
    26、获取指定好友朋友圈任务及返回PullFriendCircleTask = 1201; 
    返回手机朋友圈数据CirclePushNotice = 2029; 
    27、获取朋友圈的图片任务及返回PullCircleDetailTask = 1202; 
    返回朋友圈图片上传信息CircleDetailNotice = 1040; 
    28、单条朋友圈点赞任务CircleLikeTask = 1203; 
    返回通用任务执行结果
    29、触发手机推送群聊列表任务及结果返回TriggerChatroomPushTask = 1210; 
    返回一:手机端推送群聊列表(分页,每页2个)ChatroomPushNotice = 2031; 
    返回二:群成员(陌生人)信息列表(分页,每页100)ChatRoomMembersNotice = 2034; 
    30、请求具体群聊的详细信息任务RequestChatRoomInfoTask = 1211; 
    返回ChatRoomAddNotice 群聊新增通知
    31、获取联系人详细信息任务及返回
    (不一定是好友,如群聊成员)RequestContactsInfoTask = 1212; 
    返回联系人信息ContactsInfoNotice = 1036; 
    32、群聊管理任务及返回ChatRoomActionTask = 1213; 
    返回通用任务执行结果
    返回群聊通知类返回结果
    33、群内加好友任务AddFriendInChatRoomTask = 1214;
    返回通用任务执行结果
    34、通讯录加好友任务AddFriendFromPhonebookTask = 1215; 
    返回通用任务执行结果
    35、删除好友任务及返回DeleteFriendTask = 1216;  
    返回通用任务执行结果
    微信个人号移除好友通知
    36、发红包任务及返回  
    github地址https://www.wuliaokankan.cn/url301/138.html

    SendLuckyMoneyTask = 1217; 返回:通用任务执行结果,成功ErrMsg=sendId
    37、获取聊天消息的原始内容(主要是xml内容)任务及返回RequestTalkContentTask = 1218; 
    返回聊天消息的原始内容RequestTalkContentTaskResultNotice = 1219; 
    38、转发消息内容任务及返回ForwardMessageByContentTask = 1220; 
    返回通用任务执行结果
    39、群主通过入群申请任务及返回ChatRoomInviteApproveTask = 1221;
    返回通用任务执行结果
    40、设置联系人标签任务及返回ContactLabelTask = 1224; // 设置联系人标签
    返回联系人标签新增,修改通知;
    返回通用任务执行结果
    41、删除联系人标签任务及返回ContactLabelDeleteTask = 1225; // 删除联系人标签
    返回通用任务执行结果
    返回联系人标签删除通知
    42、语音消息转文字命令及返回VoiceTransTextTask = 1226; // 语音消息转文字
    返回:通用任务执行结果,成功ErrMsg=文字内容
    43、查找微信联系人任务及返回FindContactTask = 1227; // 查找微信联系人
    返回查找微信联系人结果
    FindContactTaskResult = 1228; // 查找微信联系人结果
    44、同意加入群聊命令及返回AgreeJoinChatRoomTask = 1229; // 同意加入群聊
    返回通用任务执行结果
    45、清空聊天记录任务及返回ClearAllChatMsgTask= 1230; // 清空聊天记录
    返回通用任务执行结果
    46、聊天界面发送朋友验证任务及返回(别人把你删掉了,你发消息会出现一个发送朋友验证的链接,此处有用到)
    返回通用任务执行结果
    47、获取会话列表任务及返回TriggerConversationPushTask = 1232; // 会话列表推送
    返回聊天会话列表(分页)ConversationPushNotice = 2035; // 会话列表
    48、微信设置(改昵称,头像)任务及返回WechatSettingTask = 1233; // 微信设置:改昵称,头像
    返回通用任务执行结果
    49、获取加好友请求列表任务及返回结果PullFriendAddReqListTask = 1234; //获取加好友请求列表
    返回请求加好友列表FriendAddReqListNotice = 2036; // 加好友请求列表
    50、获取公众号列表任务及结果返回TriggerBizContactPushTask = 1235; // 获取公众号列表
    返回公众号列表BizContactPushNotice = 2037; // 公众号列表推送
    51、获取时间段内的所有聊天消息msgSvrId及结果返回TriggerChatMsgIdsPushTask = 1251;
    52、名片加好友任务及结果返回AddFriendNameCardTask = 1236; // 名片加好友
    返回通用任务执行结果
    53、根据msgSvrId获取聊天消息及结果返回RequestTalkMsgTask = 1252;  // 根据msgSvrId获取聊天消息
    返回RequestTalkMsgTaskResultNotice = 1253;  
    5、服务端通知执行的命令 微信sdk
    1、微信账号登出命令WechatLogoutTask = 1222;
    无返回;微信退出会触发微信离线通知(WeChatOfflineNoticeMessage)
    2、手机操作指令(重启手机等)PhoneActionTask = 1223; // 手机操作指令
    返回:通用任务执行结果,(上传本地文件:ErrMsg=文件url)
    3、通知手机客户端软件升级UpgradeDeviceAppNotice = 1094; 
    无返回
    4、服务端删除设备通知手机端PostDeleteDeviceNotice = 1097; 
    无返回
    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口,微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页个人微信api分享,微信机器人SDK接口API,个人微信号API接口,微信群API接口


    展开全文
  • 在支付成功后,接口接受到微信服务器的支付通知结果,处理完数据,接口返回给微信服务数据时出现了问题。微信服务器识别不到返回的数据,导致重复通知。最终解决代码如下: protected virtual ...

    最近开发微信小程序中用到了微信支付功能,接口开发用的ASP.NET WEB API;

    在支付成功后,接口接受到微信服务器的支付通知结果,处理完数据,接口返回给微信服务数据时出现了问题。

    微信服务器识别不到返回的数据,导致重复通知。

    最终解决代码如下:

            protected virtual HttpResponseMessage RetMessage(object msg)
            {
                return new HttpResponseMessage
                {
                    Content =  new StringContent(msg.ToString(),new UTF8Encoding(false)
                      , "text/plain")
                };
    
            }
            [HttpPost]
            public HttpResponseMessage Wx_Notify()
            {
                        //业务处理代码,以下为返回
                        WxPayData res = new WxPayData();
                        res.SetValue("return_code", "SUCCESS");
                        res.SetValue("return_msg", "OK");
                        return RetMessage(res.ToXml());
             }

    WxPayData 为腾讯官方提供源码中的类

    namespace WxPayAPI
    {
        /// <summary>
        /// 微信支付协议接口数据类,所有的API接口通信都依赖这个数据结构,
        /// 在调用接口之前先填充各个字段的值,然后进行接口通信,
        /// 这样设计的好处是可扩展性强,用户可随意对协议进行更改而不用重新设计数据结构,
        /// 还可以随意组合出不同的协议数据包,不用为每个协议设计一个数据包结构
        /// </summary>
        public class WxPayData
        {
            public WxPayData()
            {
    
            }
    
            //采用排序的Dictionary的好处是方便对数据包进行签名,不用再签名之前再做一次排序
            private SortedDictionary<string, object> m_values = new SortedDictionary<string, object>();
    
            /**
            * 设置某个字段的值
            * @param key 字段名
             * @param value 字段值
            */
            public void SetValue(string key, object value)
            {
                m_values[key] = value;
            }
    
            /**
            * 根据字段名获取某个字段的值
            * @param key 字段名
             * @return key对应的字段值
            */
            public object GetValue(string key)
            {
                object o = null;
                m_values.TryGetValue(key, out o);
                return o;
            }
    
            /**
             * 判断某个字段是否已设置
             * @param key 字段名
             * @return 若字段key已被设置,则返回true,否则返回false
             */
            public bool IsSet(string key)
            {
                object o = null;
                m_values.TryGetValue(key, out o);
                if (null != o)
                    return true;
                else
                    return false;
            }
    
            /**
            * @将Dictionary转成xml
            * @return 经转换得到的xml串
            * @throws WxPayException
            **/
            public string ToXml()
            {
                //数据为空时不能转化为xml格式
                if (0 == m_values.Count)
                {
                    Log.Error(this.GetType().ToString(), "WxPayData数据为空!");
                    throw new WxPayException("WxPayData数据为空!");
                }
    
                string xml = "<xml>";
                foreach (KeyValuePair<string, object> pair in m_values)
                {
                    //字段值不能为null,会影响后续流程
                    if (pair.Value == null)
                    {
                        Log.Error(this.GetType().ToString(), "WxPayData内部含有值为null的字段!");
                        throw new WxPayException("WxPayData内部含有值为null的字段!");
                    }
    
                    if (pair.Value.GetType() == typeof(int))
                    {
                        xml += "<" + pair.Key + ">" + pair.Value + "</" + pair.Key + ">";
                    }
                    else if (pair.Value.GetType() == typeof(string))
                    {
                        xml += "<" + pair.Key + ">" + "<![CDATA[" + pair.Value + "]]></" + pair.Key + ">";
                    }
                    else//除了string和int类型不能含有其他数据类型
                    {
                        Log.Error(this.GetType().ToString(), "WxPayData字段数据类型错误!");
                        throw new WxPayException("WxPayData字段数据类型错误!");
                    }
                }
                xml += "</xml>";
                return xml;
            }
    
            /**
            * @将xml转为WxPayData对象并返回对象内部的数据
            * @param string 待转换的xml串
            * @return 经转换得到的Dictionary
            * @throws WxPayException
            */
            public SortedDictionary<string, object> FromXml(string xml)
            {
                if (string.IsNullOrEmpty(xml))
                {
                    Log.Error(this.GetType().ToString(), "将空的xml串转换为WxPayData不合法!");
                    throw new WxPayException("将空的xml串转换为WxPayData不合法!");
                }
    
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.LoadXml(xml);
                XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
                XmlNodeList nodes = xmlNode.ChildNodes;
                foreach (XmlNode xn in nodes)
                {
                    XmlElement xe = (XmlElement)xn;
                    m_values[xe.Name] = xe.InnerText;//获取xml的键值对到WxPayData内部的数据中
                }
    			
                try
                {
    				//2015-06-29 错误是没有签名
    				if(m_values["return_code"] != "SUCCESS")
    				{
    					return m_values;
    				}
                    CheckSign();//验证签名,不通过会抛异常
                }
                catch(WxPayException ex)
                {
                    throw new WxPayException(ex.Message);
                }
    
                return m_values;
            }
    
            /**
            * @Dictionary格式转化成url参数格式
            * @ return url格式串, 该串不包含sign字段值
            */
            public string ToUrl()
            {
                string buff = "";
                foreach (KeyValuePair<string, object> pair in m_values)
                {
                    if (pair.Value == null)
                    {
                        Log.Error(this.GetType().ToString(), "WxPayData内部含有值为null的字段!");
                        throw new WxPayException("WxPayData内部含有值为null的字段!");
                    }
    
                    if (pair.Key != "sign" && pair.Value.ToString() != "")
                    {
                        buff += pair.Key + "=" + pair.Value + "&";
                    }
                }
                buff = buff.Trim('&');
                return buff;
            }
    
    
            /**
            * @Dictionary格式化成Json
             * @return json串数据
            */
            public string ToJson()
            {
                string jsonStr = Json.ToJson(m_values);
                return jsonStr;
            }
    
            /**
            * @values格式化成能在Web页面上显示的结果(因为web页面上不能直接输出xml格式的字符串)
            */
            public string ToPrintStr()
            {
                string str = "";
                foreach (KeyValuePair<string, object> pair in m_values)
                {
                    if (pair.Value == null)
                    {
                        Log.Error(this.GetType().ToString(), "WxPayData内部含有值为null的字段!");
                        throw new WxPayException("WxPayData内部含有值为null的字段!");
                    }
    
                    str += string.Format("{0}={1}<br>", pair.Key, pair.Value.ToString());
                }
                Log.Debug(this.GetType().ToString(), "Print in Web Page : " + str);
                return str;
            }
    
            /**
            * @生成签名,详见签名生成算法
            * @return 签名, sign字段不参加签名
            */
            public string MakeSign()
            {
                //转url格式
                string str = ToUrl();
                //在string后加入API KEY
                str += "&key=" + WxPayConfig.KEY;
                //MD5加密
                var md5 = MD5.Create();
                var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(str));
                var sb = new StringBuilder();
                foreach (byte b in bs)
                {
                    sb.Append(b.ToString("x2"));
                }
                //所有字符转为大写
                return sb.ToString().ToUpper();
            }
    
            /**
            * 
            * 检测签名是否正确
            * 正确返回true,错误抛异常
            */
            public bool CheckSign()
            {
                //如果没有设置签名,则跳过检测
                if (!IsSet("sign"))
                {
                   Log.Error(this.GetType().ToString(), "WxPayData签名存在但不合法!");
                   throw new WxPayException("WxPayData签名存在但不合法!");
                }
                //如果设置了签名但是签名为空,则抛异常
                else if(GetValue("sign") == null || GetValue("sign").ToString() == "")
                {
                    Log.Error(this.GetType().ToString(), "WxPayData签名存在但不合法!");
                    throw new WxPayException("WxPayData签名存在但不合法!");
                }
    
                //获取接收到的签名
                string return_sign = GetValue("sign").ToString();
    
                //在本地计算新的签名
                string cal_sign = MakeSign();
    
                if (cal_sign == return_sign)
                {
                    return true;
                }
    
                Log.Error(this.GetType().ToString(), "WxPayData签名验证错误!");
                throw new WxPayException("WxPayData签名验证错误!");
            }
    
            /**
            * @获取Dictionary
            */
            public SortedDictionary<string, object> GetValues()
            {
                return m_values;
            }
        }
    }

    展开全文
  • 微信小程序服务通知开发

    千次阅读 2019-10-22 20:33:24
    微信服务通知类似短信,但是开发相对简单,在发开前必须搞懂下面的几个参数,因为这几个参数关系到你开发是否成功。 1:参数 这里先说参数的意义,如何获取下面详细讲解。 openid:每个微信唯一的id,服务通知用它的...

    微信服务通知类似短信,但是开发相对简单,在发开前必须搞懂下面的几个参数,因为这几个参数关系到你开发是否成功。
    1:参数
    这里先说参数的意义,如何获取下面详细讲解。
    openid:每个微信唯一的id,服务通知用它的作用是你想要通知谁,谁的openid就给你发送过去,它类似你的电话号码,给你发短信,必须知道你的电话号。
    access_token:因为如何实现微信服务通知,底层我们不知道,微信给了接口,想用这个接口必须有access_token参数。因为微信保密做的还相对严格,所以获取就需要各种参数。
    form_id:我对这个理解不是很到位,在我看来就是触发这个微信服务通知函数、参数;先这样理解,你知道它必须获取就可以了。
    template_id:模板id,这个就是微信公众平台里边,你选用什么格式通知模板,就把对应的template_id粘贴过来。
    appid、secret:在微信公众平台里边,这个大家应该都熟悉,我就不多说了。
    接下来我讲解一下消息模板的设置:
    进入微信公众平台:
    (1)点击图片中箭头指向的消息模板:
    在这里插入图片描述
    (2)有很多的消息模板,选择适合你的。
    在这里插入图片描述
    (3)记住你的template_id,在接下来的开发你要用到
    在这里插入图片描述
    2:接下来讲解获取上面参数过程
    (1)获取access_token
    微信小程序代码

     //获取access_token
        wx.request({
          url: 'https://www.lined5530.top/lg/wxsendmesController/at',
          success:function(res){
            var at=wx.setStorageSync("at", res.data.mes)
            console.log(res.data.mes)
          }
        })
    

    Java后台代码

    String accessToken;//因为用到的地方很多,所以我写成全局变量了
    	//获取accessToken
    	@RequestMapping("at")
    	@ResponseBody
    	public JSONObject at() {
            // 微信小程序ID
            String appid = "你自己的appid";
            // 微信小程序秘钥
            String secret = "你自己的秘钥";
    
            String url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+appid+"&secret="+secret;
            // 发送请求,返回Json字符串
            String str = WeChatUtil.httpRequest(url, "GET", null);
            // 转成Json对象 获取openid
            Map<String,String> map=new HashMap<String,String>();
            //转化成json
            JSONObject fromObject = JSONObject.fromObject(str);
            //获取at
            accessToken = fromObject.getString("access_token");
            System.out.println("后台获取的"+accessToken);
            //给小程序端返回at
            map.put("mes", accessToken);
        	JSONObject json=JSONObject.fromObject(map);
    		return json;
            //JSONObject jsonObject = JSONObject.parseObject(str);
            //System.out.println("access_token---"+jsonObject.toJSONString());
            // 我们需要的openid,在一个小程序中,openid是唯一的
    //        String access_token = jsonObject.get("access_token").toString();
    //        return access_token;	
    	}
    

    不出意外你第一个参数成功获取
    (2)获取openid
    在获取openid的时候,你先要获取code。通过login这个接口就可以获取,比较简单,你看代码应该可以看明白。

      //获取openid
        wx.login({
          success: function (res) {
            var code1 = res.code//获取openid需要code
            var appid1 = "自己的aappid"
            var secret1 = "自己的秘钥"
            var ul = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + appid1 + '&secret=' + secret1 + '&js_code=' + code1 + '&grant_type=authorization_code'
            //获取openid
            wx.request({
              url: ul,
              method: 'GET',
              success: function (e) {
                var openid = e.data.openid
                console.log('获取登录身份的唯一openid', openid)
                wx.setStorageSync('openid', openid)
              }
            })
          }
        })
    

    很多人可能看到别人在后台获取openid,其实没必要,在js中直接可以获取,不出意外,第二个重要的参数你也获取成功了。
    (3)获取form_id
    这个获取在小程序直接完成就可以
    微信小程序的wxml代码

     <form bind:submit="sendMessage" report-submit="true">
          <button formType="submit">发送模板消息</button>
     </form>```
    
    

    获取fromid就要出发发给微信发送通知的代码了
    js代码

     sendMessage: function (e) {
        var today = new Date();
        var year = today.getFullYear();
        var m1 = today.getMonth();
        var month = m1 + 1
        var day = today.getDate();
        var h = today.getHours();
        var m = today.getMinutes();
        var etime = year + "-" + month + "-" + day 
        var time=h+":"+m
        console.log("formId");
        console.log(e);
        //对应通知服务的格式,你在选取模板的时候,用到几个参数,就设置几个参数
        let _jsonData =
        {
          "touser": "对应给谁发送就写谁的openid",
          "weapp_template_msg": {
            "template_id": "公众平台里边模板id",
            //服务通知中进入小程序的入口
            "page": "pages/index/index",
            "form_id": e.detail.formId,
            "data": {
              "keyword1": {
                "value": wx.getStorageSync("name")
              },
              "keyword2": {
                "value": etime
              },
              "keyword3": {
                "value": time
              },
              "keyword4": {
                "value": "内蒙古师范大学大数据楼316"
              }
            },
            "emphasis_keyword": "keyword1.DATA"
          }
        }
        // wx.showModal({
        //   title: 'formdID',
        //   content: e.detail.formId,
        // })
        //向后台请求,把刚才设置好的参数发送到后台
        wx.request({
          url: 'https://www.lined5530.top/lg/wxsendmesController/sendMsg',
          data:_jsonData,//直接发送的json数据格式
          method: 'POST',
          header: {
            'content-type': 'application/json' // 默认值
          },
          success: function (res) {
            console.log("res")
            console.log(res)
          }
        })
        console.log("faxiaox")
      },
    
    

    对应后台的代码

    //发送消息
    	@RequestMapping("addsenddata")
        @ResponseBody
          public void sendMessage(@RequestBody String _jsonData){
            System.out.println("sendMesg传入参数"+_jsonData);
            // 微信小程序ID
            String appid = "自己appid";
            // 微信小程序秘钥
            String secret = "自己的秘钥";
    
            String ACCESS_TOKEN=accessToken;
            // 根据小程序穿过来的code想这个url发送请求
            String url = "https://api.weixin.qq.com/cgi-bin/message/wxopen/template/uniform_send?access_token="+ACCESS_TOKEN;
            // 发送请求,返回Json字符串
            String str = WeChatUtil.httpRequest(url, "POST", _jsonData);
            // 转成Json对象 获取openid
            JSONObject fromObject = JSONObject.fromObject(str);
            
            //JSONObject jsonObject = JSONObject.parseObject(str);
            System.out.println("jsonObject____"+fromObject.toString());
            // 我们需要的openid,在一个小程序中,openid是唯一的
        }
    

    最后你可能用到WeChatUtil这个方法

    public class WeChatUtil {
        public static String httpRequest(String requestUrl,String requestMethod,String output){
            try{
                URL url = new URL(requestUrl);
                HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
                connection.setDoOutput(true);
                connection.setDoInput(true);
                connection.setUseCaches(false);
                if(null != output){
                    OutputStream outputStream = connection.getOutputStream();
                    outputStream.write(output.getBytes("utf-8"));
                    outputStream.close();
                }
                // 从输入流读取返回内容
                InputStream inputStream = connection.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                StringBuffer buffer = new StringBuffer();
                while ((str = bufferedReader.readLine()) != null){
                    buffer.append(str);
                }
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                inputStream = null;
                connection.disconnect();
                return buffer.toString();
            }catch(Exception e){
                e.printStackTrace();
            }
            return "";
        }
    }
    

    最后的效果如下
    在这里插入图片描述
    以上是我学习的整个过程,研究一下午搞好的,希望可以帮助大家。

    展开全文
  • 作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里...
  • 微信支付接口开发——支付这几天在做支付服务,系统接入了支付宝、微信、银联三方支付接口。个人感觉支付宝的接口开发较为简单,并且易于测试。关于数据传输,微信是用xml,所以需要对xml进行解析。1、微信支付的几种...

    微信支付接口开发——支付

    这几天在做支付服务,系统接入了支付宝、微信、银联三方支付接口。个人感觉支付宝的接口开发较为简单,并且易于测试。

    关于数据传输,微信是用xml,所以需要对xml进行解析。

    1、微信支付的几种接口

    付款码支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付。几种支付方式都是大同小异。

    2、支付流程

    基于APP支付来说,微信支付的大体流程:

    1、APP客户端根据用户支付请求,将订单信息(订单号,金额等)传至后台服务器

    2、后台服务器根据订单信息,拼装微信统一下单接口需要的请求参数。其中比较重要的参数为appid、mch_id、nonce_str、sign、out_trade_no、total_fee、notify_url。

    这里参数拼装需要根据微信提供的签名算法

    假设请求参数为:

    "appid":"wxd930ea5d5a258f4f"

    "mch_id":"10000100"

    "body":"test"

    "nonce_str":"ibuaiVcKdpRxkhJA"

    需要将以上参数按照规则先拼装成String

    key值按照ASCII从小到大排序(A->Z),key=value形式并用&连接

    String a = "appid=wxd930ea5d5a258f4f&mch_id=10000100&body=test&nonce_str=ibuaiVcKdpRxkhJA"

    拼接API密钥 key 是商户平台设置的密钥key

    signStr = a + "&key=192006250b4c09247ec02edce69f6a2d"

    MD5签名(转大写) 注:微信默认为MD5签名,也支持HMAC-SHA256签名方式

    sign=MD5(signStr).toUpperCase()

    //最终得到sign = "9A0A8659F005D6984697E2CA0A9CF3B7"

    然后sign继续按照规则(A->Z)拼装进String中。

    java中可以用map完成排序

    Map paramsMap = new TreeMap(String::compareTo);

    paramsMap.put("appid", APP_APP_ID);

    ......

    //完成签名得到sign

    paramsMap.put("sign",sign);

    最后需要将参数转化成xml格式的string进行接口请求

    ![CDATA[wxd930ea5d5a258f4f]]

    ![CDATA[10000100]]

    ![CDATA[1000]]

    ![CDATA[ibuaiVcKdpRxkhJA]]

    ![CDATA[9A0A8659F005D6984697E2CA0A9CF3B7]]

    3、微信支付统一下单的接口地址为:https://api.mch.weixin.qq.com/pay/unifiedorder

    java中可以利用httpclient进行post调用。参数即之前拼接完成的带sign签名参数。

    得到微信支付接口的返回值也同样是xml格式的数据,需要我们将其转成便于操作的map型数据。

    返回的数据包含了return_code、return_msg。

    return_code只有SUCCESS和FAIL,这是通信成功与否的标识,非业务标识。

    只有return_code是SUCCESS时,才会有其他数据返回包括result_code,sign等。

    若result_code业务标识也同样为SUCCESS时候才说明微信方预付单生成成功。

    这时会返回我们支付业务需要的prepay_id预支付会话id。

    注意: 这里需要我们进行sign签名验证,以保证数据安全性

    4、将通过验签的prepay_id等信息返回给APP客户端。此时APP端可以调起支付接口,

    调起了微信支付窗口,让用户完成支付操作。

    然后微信端会根据之前设置的notify_url异步通知地址,进行调用。通知服务端支付情况。

    3、总结

    微信支付接口开发还涉及到订单的相关业务(查询,关闭),以及退款等相关业务。

    微信支付主要需要先了解其业务流程,然后就是调用微信支付的接口,其中就是参数的拼装与验签。这部分可以抽取成一个工具类,比如mapToXml(),xmlToMap(),md5()等等。最后根据接口文档中返回的数据判断进行业务操作。

    最后吐槽一下,微信测试号没有提供支付测试环境,需要真实的服务号。

    展开全文
  • 2.按照上篇文章,先成功接入微信接口 3.由于winxin4j使用redis进行缓存Token,所以请先配置springboot+redis的集成,它的access_token每2小时变换一次。 1)启动redis,连接radis 2)配置项目中的redis信息 导入依赖...
  • 上文介绍了如何用go开发微信H5支付下单的接口,支付...如果链接无法访问,商户将无法接收到微信通知。 通知url必须为直接可访问的url,不能携带参数。 示例:notify_url:“https://pay.weixin.qq.com/wxpay/pay.act...
  • 能够模拟微信消息接口向开发者服务器发送消息通知。用于微信公众号消息接口调试。
  • 微信开发接口

    2019-10-25 16:27:51
    安卓微信的api,个人微信开发API协议,微信 ipad sdk,微信ipad协议,微信web版接口api,微信网页版接口微信电脑版sdk,微信开发sdk,微信开发API,微信协议,微信接口文档sdk,替代微信ipad协议的api接口,网页...
  • 微信服务开发-整合微信支付

    千次阅读 2018-03-01 12:59:39
    最近的项目在对接微信支付,所以抽出一些时间...文档中分别对支付账户(参数)、接口规则、支付业务场景,流程、API做了详细介绍,并提供了SDK以及DEMO ,大部分有一定基础的开发或研发,均可参照文档及其demo,一步一...
  • PHP版本微信公众号接口封装,可用于开发微信公众号网页,可解决新手,快速获取用户openid,模板通知,二维码生成等功能
  • 微信后台会向商户推送告警通知,包括发货延迟、调用失败、通知失败等情况,通知的地址是商户在申请支付时填写的告警通知URL,在“公众平台-服务-服务中心-商户功能-商户基本资料-告警通知URL”可以查看。商户接收到...
  • 在公众号开发中如果我们不能再五秒内给予微信服务器响应,那么微信服务器就会断开连接并且重新发起通知,会连续通知三次。 这样会造成一个问题就是,我们的业务逻辑如果不能保证五秒内回复微信通知那么微信就会给...
  • 本文介绍js api模式调用微信支付接口,及如何正确调试发货通知接口,从微信支付的测试状态切换到全网支付状态。这个对微网站手机支付开发非常有用。
  • 微信域名被拦截的提示:一:域名里的内容违规或诱导被举报而导致的拦截二:被用户或同行恶意举报三:服务商(例如腾讯,360一段时间的批量封杀域名)等等情况四:网站有强制分享,或者诱导分享 如何打开在微信被屏蔽...
  • 微信支付接口开发流程

    千次阅读 2018-07-18 16:41:03
    【3】通过审核进入开发流程,通过开发接口文档的指引,完成开发。 【4】签订合同并缴纳保证金后,即可开通微信支付能力。 第二步,微信支付接口开发: 【1】商家完成支付接口申请 【2】签定支付接口开发合同 【3】...
  • 开发过程中怎么接入实现微信和支付宝支付呢?其实微信和支付宝平台上都会有支付接入文档。所以按照惯例,首先的阅读一遍官方文档。随着官方文档的流程走,前台和后台相结合,实现自己app的支付流程。 一、微信...
  • 微信开发之——接口权限

    千次阅读 2017-01-18 17:08:40
    1、微博认证视作未认证,因此微博认证的公众号不会拥有微信认证公众号特有的接口。 2、微信认证分为资质认证和名称认证两部分,只需要资质认证通过,就可获得接口接口名称 未认证订阅号 微信认证订阅号...
  • 通过开发接口文档的指引,完毕开发。 【4】签订合同并缴纳保证金后。就可以开通微信支付能力。 第二步。微信支付接口开发: 【1】商家完毕支付接口申请 【2】签定支付接口开发合同 【3】制定接口...
  • 服务号 企业号 2. 公众号 微信公众号主要面向名人、政府、媒体、企业等机构推出的合作推广业务。在这里可以通过微信渠道将品牌推广给上亿的微信用户,减少宣传成本,提高品牌知名度,打造更具影响力的品牌形象...
  • 个人微信开发协议sdk接口API分享 1、基础消息类型 1、客户端发送的心跳包 HeartBeatReq = 1001; 2、消息接收确认回复(接收或拒绝接收) MsgReceivedAck = 1002; 3、错误单独提升为一种消息类型 Error = 1003; 4...
  • java微信开发模板消息接口使用

    千次阅读 2016-03-25 11:13:19
    微信开发--模板消息接口 http://blog.csdn.net/u010486495/article/details/46985729 微信开发者文档:模板消息接口 模板消息运营规范:...
  • C# 2015开发微信支付统一下单接口, 支付完成通知接口,坑了一个周终于出来了 分享给大家 最主要的坑就是APP签名 大家做的时候 为避免大家误解这个签名 我把签名工具的下载地址给大家 ... 还是不懂的话可以去看我博客 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,439
精华内容 10,575
关键字:

微信服务通知开发接口