- 微信支付分账接口,添加分账方时提示:平台证书序列号Wechatpay-Serial错误
问题:接口返回信息“平台证书序列号Wechatpay-Serial错误” Wechatpay-Serial字段根据要求也进行了加密,但是一直提示这个错误,也没法校验到底哪出错了。申明一下加密用的是微信支付平台证书序列号,不是商户证书序列号; 请求参数 /// <summary> /// 添加分账接收方 /// </summary> /// <param name="account"></param> /// <param name="name"></param> /// <param name="relation_type"></param> /// <returns></returns> public static string AddReceiver(string account, string name, string relation_type, string public_key) { // 敏感信息加密 var enrypt_name = "pUrPcj/7VWvH11fBIE/KcMdt89KEcbnyEEGuVZ74jBGzskgPAaGl9VcF0Eagkx0EcSqWqHSZZy5+D91q2n4yk91jHIrCFEvLk4ZUVfljKvXcyZBZBXZYjjFFba3KoCEOjGFnhCJUHOfqnk0DVCxmqhHKQ6HwhvxhNWPjtrZ8s0PZXn3zrZtCsir3TeqpmqZLTgrIjJRlaJplwFMFl5iYuWJqZT1GTfMAVlRD/QiQTwjuxkPki40PYc/+HHVRiKz+6Jg6r0aHG7KWiM1r/QtUkNyLKKsIfGKMKllo8RJbgce7dz1VDTZah04jMtoxM9DjpnOb5qq6yCqlZjuutrPASQ=="; SortedDictionary<string, object> dic = new SortedDictionary<string, object>(); dic.Add("appid", WeChatConfig.APPID); dic.Add("type", "MERCHANT_ID"); dic.Add("account", "15333560710"); dic.Add("name", enrypt_name); dic.Add("relation_type", "PARTNER"); var data = Newtonsoft.Json.JsonConvert.SerializeObject(dic); var url = "https://api.mch.weixin.qq.com/v3/profitsharing/receivers/add"; var path = System.Environment.CurrentDirectory + "/wwwroot/apiclient_cert.p12"; X509Certificate2 cert = new X509Certificate2(path, WeChatConfig.MCHID, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); var serial_no = cert.SerialNumber; string result = RequestData(url, data, WeChatConfig.MCHID, serial_no, public_key); return result; } 发送请求 /// <summary> /// 发送请求至微信 /// </summary> /// <param name="url"></param> /// <param name="data"></param> /// <param name="mchid"></param> /// <param name="serial_no"></param> /// <param name="public_key"></param> /// <returns></returns> public static string RequestData(string url, string data, string mchid, string serial_no, string public_key) { byte[] byte_public_key = Encoding.UTF8.GetBytes(public_key); var encrypt_serial_no = RSAEncrypt("1D99F55A2525B50D10571B129F274FB801769CBB", byte_public_key); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); request.Method = "POST"; request.ContentType = "application/json;"; request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36"; request.Accept = "application/json"; string authorization = GetAuthorization(url, "POST", data, mchid, serial_no); request.Headers.Add("Authorization", authorization); request.Headers.Add("Wechatpay-Serial", encrypt_serial_no); byte[] paramJsonBytes; paramJsonBytes = Encoding.UTF8.GetBytes(data); request.ContentLength = paramJsonBytes.Length; Stream writer; try { writer = request.GetRequestStream(); } catch (Exception) { writer = null; } writer.Write(paramJsonBytes, 0, paramJsonBytes.Length); writer.Close(); HttpWebResponse response; try { response = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { response = ex.Response as HttpWebResponse; } Stream resStream = response.GetResponseStream(); StreamReader reader = new StreamReader(resStream); string text = reader.ReadToEnd(); return text; } 加密敏感信息 /// <summary> /// 加密微信支付平台证书序列号 /// </summary> /// <param name="text">微信支付平台证书序列号</param> /// <param name="publicKey">公钥</param> /// <returns></returns> public static string RSAEncrypt(string text, byte[] publicKey) { var cer = new X509Certificate2(publicKey); var rsaParam = cer.GetRSAPublicKey().ExportParameters(true); var rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(rsaParam); var buff = rsa.Encrypt(Encoding.UTF8.GetBytes(text), true); return Convert.ToBase64String(buff); } 签名 protected static string Sign(string message) { var path = System.Environment.CurrentDirectory + "/wwwroot/apiclient_cert.p12"; X509Certificate2 cert = new X509Certificate2(path, WeChatConfig.MCHID, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); var privateKey = cert.PrivateKey.ToXmlString(true); using (RSACryptoServiceProvider sha256 = new RSACryptoServiceProvider()) { byte[] dataInBytes = Encoding.UTF8.GetBytes(message); sha256.FromXmlString(privateKey); byte[] inArray = sha256.SignData(dataInBytes, CryptoConfig.MapNameToOID("SHA256")); string sign = Convert.ToBase64String(inArray); return sign; } } 获取签名 /// <summary> /// 获取签名认证 /// </summary> /// <param name="url">请求URL</param> /// <param name="method">请求方法</param> /// <param name="data">数据对象</param> /// <param name="mchid">商户ID</param> /// <param name="serial_no">商户私钥证书对应的序列号</param> /// <returns></returns> protected static string GetAuthorization(string url, string method, string data, string mchid, string serial_no) { var uri = new Uri(url); string url_path = uri.PathAndQuery; string nonce = Guid.NewGuid().ToString(); var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds(); method = string.IsNullOrEmpty(method) ? "" : method; string message = string.Format("{0}\n{1}\n{2}\n{3}\n", method, url_path, timestamp, nonce); if (!string.IsNullOrEmpty(data)) { message = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n", method, url_path, timestamp, nonce, data); } string sign = Sign(message); // 签名认证格式 string authorization = string.Format("WECHATPAY2-SHA256-RSA2048 mchid=\"{0}\",nonce_str=\"{1}\",timestamp=\"{2}\",serial_no=\"{3}\",signature=\"{4}\"", mchid, nonce, timestamp, serial_no, sign ); return authorization; } 111
2023-11-07 - 调用微信公众号文章接口获取不到最新文章,急需解决?
调用微信公众号文章接口:https://api.weixin.qq.com/cgi-bin/material/batchget_material 获取不到最新文章,只能获取截止到2021年11月底的文章,官方麻烦给个答案,影响业务。
2022-02-22 - 微信公众号自定义下拉菜单支持多语言切换吗?
官方文档地址:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Personalized_menu_interface.html 明确解释说:语言(用户在微信客户端设置的语言)不支持 请问一下权威认识,目前通过自定义菜单接口,能读取到微信当前的语言版本信息吗?比如微信切换到英文,对应下拉菜单显示英文,切换到中文,对应下拉菜单显示到中文。
2021-10-21 - 微信公众号文章列表获取接口调用失败,请求结果为0怎么回事?
接口地址:https://api.weixin.qq.com/cgi-bin/freepublish/batchget?access_token= 请求参数: { "offset":0, "count":10, "no_content":0 } 请求结果: {"item":[],"total_count":0,"item_count":0} 问一下,目前这个接口还能用吗? 怎么请求出来的结果为0 官方文档接口地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_publication_records.html
2021-10-15 - 微信搜索widget搜索关闭了吗?
今年4月份开始开发的,7月份上线。好像10月份就没了,搜索相关关键词也找不到了,官方也没有说明啊? 这个功能下架了吗?
2019-10-20 - 小程序授权头像问题
- 需求的场景描述(希望解决的问题) 我这边小程序经常有这类用户注册,搞不清楚是怎么进来的,但细分析下拉发现一个规律,这类用户的头像路径如下: https://wx.qlogo.cn/mmhead/xNKP68NQcmwwgbCoGDRdl7ZqYJiaHMPxLYQcaHuIWPtE/132 都带有“mmhead”,比较短。 我自己授权注册或朋友注册授权的如下: https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTLqQFialN2YOUyuT4354WuwvCUHmg9NGdJniblIAV7Dfe4nAdaTk2ib3GiaUyCVNojFiarGGkljIEO2S9g/132 都带有“mmopen”,比较长 而且我严重怀疑带有“mmhead”是假用户,但差不出来怎么注册进来的。名字统一3个汉字 - 希望提供的能力 官方能帮忙看一下,这类注册进来的到底是什么样的用户,你们微信官方会模拟注册用户进来(比如微信官方爬虫)? [图片]
2019-07-25 - 微信搜索widget搜索算法排序问题
- 需求的场景描述(希望解决的问题) 兄弟们,这个问题将来开发搜索widget都会遇见,在线的兄弟们帮忙看一下。 1、我们公司的小程序开发了书籍搜索服务:菠萝借书,以下简称A 2、比我们先上架书籍搜索服务的是:管书专家,以下简称B 对于新用户而且,定义是没有使用过A和B小程序的用户,我们经过一些小测试,发现搜索一些图书关键词,默认显示的都是B的结果,不是显示A的结果 要点击下拉才能看见A的,但是微信会发送请求给我们,也就是只要关键词有匹配结果,微信就会PUSH请求过来。 A公司书籍搜索服务上线了快1周了,每周搜索进来的用户一天不到10个,好悲哀啊,所以发帖求救一下。 但我们统计过微信发送的关键词请求每天达到了5000左右,也就是每天5000多个用户搜索的结果匹配到了我们接口,但是不优先展示给用户,而是优先展示了B的结果,A的结果折叠起来了。 在线的兄弟们帮忙做个测试:搜索以下关键词:围城、三体、解忧杂货店等,微信——》发现——》小程序——》搜索 帮我看看优先显示的是A还是B,帮忙跟帖标记一下。感觉花了1个多月开发的书籍搜索服务,白折腾了。 搞不懂这个搜索算法怎么弄的,下面这个案例太让人伤心了,搜索“1.2.3木头人”,优先显示的B公司,B公司提供的结果完全无法匹配实际需求,而A公司的结果非常精准,还别折叠起来,没有优先展示。没搞明白。贴几个图,给大家看一下: [图片] [图片] - 希望提供的能力 希望这个规则公平一些,我们后面开发的不是很吃亏。
2019-07-20 - 微信搜索widget,多家提供相同服务怎么显示结果?
- 需求的场景描述(希望解决的问题) 你好,发现如果存在2家以上的公司提供了相同的搜索服务,默认出来的哪一家,这个怎么知道? 目前我们知道的是有一家在我们之前开发的,优先显示都是他们的,那我我们不是白做了吗? 是否能解释一下优先显示结果的规则。 - 希望提供的能力 希望这个规则公平一些,我们后面开发的不是很吃亏。
2019-07-19 - 微信搜索widget宕机啦!iOS系统安卓正常看截图
- 当前 Bug 的表现(可附上截图) [图片] [图片] [图片] [图片] [图片] - 预期表现 搜索结果都出不来 - 复现路径 搜索所有关键词都这样的 - 提供一个最简复现 Demo 看截图
2019-07-18 - widget搜索上线,求审核。
- 需求的场景描述(希望解决的问题) 已经提交了一周多了,还没有审核结果,希望官方审核一下,谢谢 公众号AppID: wxc73a2050e64e3050 小程序AppID: wxb6ca4e8f0d35d355 [图片] - 希望提供的能力 帮忙审核一下,等待比较着急。
2019-07-16