极光推送V3版本,V2版本代码
- 格式:docx
- 大小:52.82 KB
- 文档页数:16
新浪微博分享错误代码解释10001:系统错误10002:服务端资源不可用10003:远程服务出错10005:该资源需要appkey拥有更高级的授权10006:缺少 source参数(appkey)10007:不支持的 MediaType (%s)10008:错误:参数错误,请参考API文档10009:任务过多,系统繁忙10010:任务超时10011:RPC错误10012:非法请求10013:不合法的微博用户10014:第三方应用访问api接口权限受限制10016:错误:缺失必选参数:%s,请参考API文档10017:错误:参数值非法,希望得到 (%s),实际得到 (%s),请参考API文档10018:请求长度超过限制10020:接口不存在10021:请求的HTTP METHOD不支持10022:IP请求超过上限10023:用户请求超过上限10024:用户请求接口%s超过上限10025:内部接口参数错误20001:IDS参数为空20002:uid参数为空20003:用户不存在20005:不支持的图片类型,仅仅支持JPG,GIF,PNG20006:图片太大20007:请确保使用multpart上传了图片20008:内容为空20009:id列表太长了20012:输入文字太长,请确认不超过140个字符20013:输入文字太长,请确认不超过300个字符20014:传入参数有误,请再调用一次20016:发微博太多啦,休息一会儿吧20017:你刚刚已经发送过相似内容了哦,先休息一会吧20019:不要太贪心哦,发一次就够啦20023:很抱歉,此功能暂时无法使用,如需帮助请联系@微博客服或者致电客服电话400 690 000020031:需要弹出验证码20032:微博发布成功。
目前服务器数据同步可能会有延迟,请耐心等待1-2分钟。
谢谢20033:登陆状态异常20101:不存在的微博20102:不是你发布的微博20103:不能转发自己的微博20109:微博 id为空20111:不能发布相同的微博20112:由于作者隐私设置,你没有权限查看此微博20114:标签名太长20115:标签不存在20116:标签已存在20117:最多200个标签20118:最多5个标签20119:标签搜索失败20120:由于作者设置了可见性,你没有权限转发此微博20121:visible参数非法20122:应用不存在20123:最多屏蔽200个应用20124:最多屏蔽500条微博20125:没有屏蔽过此应用20126:不能屏蔽新浪应用20127:已添加了此屏蔽20128:删除屏蔽失败20129:没有屏蔽任何应用20201:不存在的微博评论20203:不是你发布的评论20204:评论ID为空20206:作者只允许关注用户评论20207:作者只允许可信用户评论20401:域名不存在20402:verifier错误20403:屏蔽用户列表中存在此uid20404:屏蔽用户列表中不存在此uid20405:uid对应用户不是登录用户的好友20406:屏蔽用户个数超出上限20407:没有合适的uid20408:从feed屏蔽列表中,处理用户失败20501:错误:source_user 或者target_user用户不存在20502:必须输入目标用户id或者 screen_name 20503:关系错误,user_id必须是你关注的用户20504:你不能关注自己20505:加关注请求超过上限20506:已经关注此用户20507:需要输入验证码20508:根据对方的设置,你不能进行此操作20509:悄悄关注个数到达上限20510:不是悄悄关注人20511:已经悄悄关注此用户20512:你已经把此用户加入黑名单,加关注前请先解除20513:你的关注人数已达上限20522:还未关注此用户20523:还不是粉丝20601:列表名太长,请确保输入的文本不超过10个字符20602:列表描叙太长,请确保输入的文本不超过70个字符20603:列表不存在20604:不是对象所属者20605:列表名或描叙不合法20606:记录已存在20607:错误:数据库错误,请联系系统管理员20608:列表名冲突20610:目前不支持私有分组20611:创建list失败20612:目前只支持私有分组20613:错误:不能创建更多的列表20614:已拥有列表上下,请参考API文档20615:成员上线,请参考API文档20616:不支持的分组类型20617:最大返回300条20618:uid 不在列表中20701:不能提交相同的标签20702:最多两个标签20704:您已经收藏了此微博20705:此微博不是您的收藏20706:操作失败20801:trend_name是空值20802:trend_id是空值21001:标签参数为空21002:标签名太长,请确保每个标签名不超过14个字符21103:该用户已经绑定手机21104:verifier错误21105:你的手机号近期频繁绑定过多个帐号,如果想要继续绑定此帐号,请拨打客服电话400 690 0000申请绑定21108:原始密码错误21109:新密码错误21110:此用户暂时没有绑定手机21113:教育信息不存在21115:职业信息不存在21117:此用户没有qq信息21120:此用户没有微号信息21121:此微号已经存在21301:认证失败21302:用户名或密码不正确21303:用户名密码认证超过请求限制21304:版本号错误21305:缺少必要的参数21306:Oauth参数被拒绝21307:时间戳不正确21308:nonce参数已经被使用21309:签名算法不支持21310:签名值不合法21311:consumer_key不存在21312:consumer_key不合法21313:consumer_key缺失21314:Token已经被使用21315:Token已经过期21316:Token不合法21317:Token不合法21318:Pin码认证失败21319:授权关系已经被解除21320:不支持的协议21321:未审核的应用使用人数超过限制21322:重定向地址不匹配21323:请求不合法21324:client_id或client_secret参数无效21325:提供的Access Grant是无效的、过期的或已撤销的21326:客户端没有权限21327:token过期21328:不支持的 GrantType21329:不支持的 ResponseType21330:用户或授权服务器拒绝授予数据访问权限21331:服务暂时无法访问21332:access_token 无效21333:禁止使用此认证方式其他的错误代码:304 Not Modified: 没有数据返回.400 Bad Request: 请求数据不合法,或者超过请求频率限制. 详细的错误代码如下:o 40028:内部接口错误(如果有详细的错误信息,会给出更为详细的错误提示)o 40033:source_user或者target_user用户不存在o 40031:调用的微博不存在o 40036:调用的微博不是当前用户发布的微博o 40034:不能转发自己的微博o 40038:不合法的微博o 40037:不合法的评论o 40015:该条评论不是当前登录用户发布的评论o 40017:不能给不是你粉丝的人发私信o 40019:不合法的私信o 40021:不是属于你的私信o 40022:source参数(appkey)缺失o 40007:格式不支持,仅仅支持XML或JSON格式o 40009:图片错误,请确保使用multipart上传了图片o 40011:私信发布超过上限o 40012:内容为空o 40016:微博id为空o 40018:ids参数为空o 40020:评论ID为空o 40023:用户不存在o 40024:ids过多,请参考API文档o 40025:不能发布相同的微博o 40026:请传递正确的目标用户uid或者screen nameo 40045:不支持的图片类型,支持的图片类型有JPG,GIF,PNG o 40008:图片大小错误,上传的图片大小上限为5Mo 40001:参数错误,请参考API文档o 40002:不是对象所属者,没有操作权限o 40010:私信不存在o 40013:微博太长,请确认不超过140个字符o 40039:地理信息输入错误o 40040:IP限制,不能请求该资源o 40041:uid参数为空o 40042:token参数为空o 40043:domain参数错误o 40044:appkey参数缺失o 40029:verifier错误o 40027:标签参数为空o 40032:列表名太长,请确保输入的文本不超过10个字符o 40030:列表描述太长,请确保输入的文本不超过70个字符o 40035:列表不存在o 40053:权限不足,只有创建者有相关权限o 40054:参数错误,请参考API文档o 40059: 插入失败,记录已存在o 40060:数据库错误,请联系系统管理员o 40061:列表名冲突o 40062:id列表太长了o 40063:urls是空的o 40064:urls太多了o 40065:ip是空值o 40066:url是空值o 40067:trend_name是空值o 40068:trend_id是空值o 40069:userid是空值o 40070:第三方应用访问api接口权限受限制o 40071:关系错误,user_id必须是你关注的用户o 40072:授权关系已经被删除o 40073:目前不支持私有分组o 40074:创建list失败o 40075:需要系统管理员的权限o 40076:含有非法词o 40084:提醒失败,需要权限o 40082:无效分类!o 40083:无效状态码o 40084:目前只支持私有分组401 Not Authorized: 没有进行身份验证.o 40101 version_rejected Oauth版本号错误o 40102 parameter_absent Oauth缺少必要的参数o 40103 parameter_rejected Oauth参数被拒绝o 40104 timestamp_refused Oauth时间戳不正确o 40105 nonce_used Oauth nonce参数已经被使用o 40106 signature_method_rejected Oauth签名算法不支持o 40107 signature_invalid Oauth签名值不合法o 40108 consumer_key_unknown! Oauth consumer_key不存在o 40109 consumer_key_refused! Oauth consumer_key不合法o 40110 token_used! Oauth Token已经被使用o 40111 Oauth Error: token_expired! Oauth Token已经过期o 40112 token_revoked! Oauth Token不合法o 40113 token_rejected! Oauth Token不合法o 40114 verifier_fail! Oauth Pin码认证失败402 Not Start mblog: 没有开通微博403 Forbidden: 没有权限访问对应的资源.o 40301 too many lists, see doc for more info 已拥有列表上限o 40302 auth faild 认证失败o 40303 already followed 已经关注此用户o 40304 Social graph updates out of rate limit 发布微博超过上限o 40305 update comment out of rate 发布评论超过上限o 40306 Username and pwd auth out of rate limit 用户名密码认证超过请求限制o 40307 HTTP METHOD is not suported for this request 请求的HTTP METHOD不支持o 40308 Update weibo out of rate limit 发布微博超过上限o 40309 password error 密码不正确o 40314 permission denied! Need a high level appkey 该资源需要appkey拥有更高级的授权404 Not Found: 请求的资源不存在.500 Internal Server Error: 服务器内部错误.502 Bad Gateway: 微博接口API关闭或正在升级 .503 Service Unavailable: 服务端资源不可用.【人人网分享错误代码大全】<1> 一个未知的错误发生<2> 服务临时不可用<3> 未知的方法<4> 应用已达到设定的请求上限<5> 请求来自未经授权的IP地址<6> 当前用户session key过期了(已过期)<7> rest api调用次数超过了限制<100> 无效未知参数<101> 无效的API_KEY<102> 无效的SESSION_KEY<103> 必须是POST提交<104> 无效的签名<200> USER PERMISSIONS ERRORS<210> API_EC_PERMISSION_USER<220> API_EC_PERMISSION_ALBUM<221> <API_EC_PERMISSION_PHOTO><450> 当前用户的sessionKey过期<451> Session key specified cannot be used to call this method<452> Session key 无效. 可能传入的sessionKey格式出现错误<453> 调用此方法时,session key 是一个必须的参数<2000> 没有得到auth_token<2001> token对象中没有得到userId<2002> 用户没有登录校内网<10000> 登录失败<10201> API_EC_REST_LACKO_API_KEY<10202> API_EC_REST_LACKOF_SESSION_KEY<10203> API_EC_REST_LACKOF_CALL_ID<10600> 此接口的调用规则是: 48小时之内,一个用户最多可以调用10次<10601> Feed标题模板是无效的,标题模板中必须含有 \"{actor}\" 变量,且只含有一个<10602> 文本空,显示内容应该在30个字符之内<10603> if {target} is used, then target_ids becomes a required parameter<10604> title_data 参数不是一个有效的JSON 格式数组<10605> Feed的标题模板缺少必须的参数,或者title_data JSON数组定义的参数不完全。
Vue3教程:Vue3+ElementPlus+Vite2的后台管理系统开源啦之前发布过⼀篇⽂章,⽂中提到会开发并开源⼀个 Vue 3 + Element Plus 的项⽬供⼤家练⼿和学习,随后也⼀直有收到留⾔和反馈,问我什么时候开源之类的问题,今天终于可以通知⼤家,完成啦! 开源啦!如果觉得我写得还⾏的话,请献上你宝贵的⼀赞 ,这将是我持续写作的动⼒!感谢⼤家啦。
vue3-admin 开源地址所有的代码、⽂件全部都开源到 GitHub 仓库中,前后端代码全部都在仓库⾥。
并没有任何藏着掖着的⾏为,包括后端 API 接⼝的代码也全部开源,不会说缺少哪个页⾯或者某个重要功能,这种事情是不存在的,⼤家先看看⽂章和预览图,觉得不错的朋友可以继续了解⼀下这个项⽬。
当然,也希望感兴趣的朋友可以找找其中的问题,提⼀些 pr 或者 issue,让这个开源项⽬能够减少问题并且保持进步。
vue3-admin 在 GitHub 和国内的码云都创建了代码仓库,如果有⼈访问 GitHub ⽐较慢的话,建议在 Gitee 上查看该项⽬,两个仓库会保持同步更新。
vue3-admin 预览地址本项⽬在⼀周之前已经部署到线上环境,在开源仓库⾥可以看到访问地址。
由于服务器的带宽并不是⾮常⼤,担⼼⼤家直接把服务器挤爆了,希望⼤家不要⼀起访问,哈哈哈哈。
测试过程和测试结果,感谢⼤家参与测试测试过程⼤概⼤半个⽉吧,总共有三轮测试,前两轮都是⾃测,改了不少问题。
后⾯是发了⼀篇⽂章介绍了这个项⽬,并且把项⽬的预览地址和测试账号密码公布出来,让⼤家⼀起点⼀点页⾯、测⼀测功能,还是有不少⼈参与到这个项⽬的测试环节的,在这⾥感谢⼀下⼤家啦。
下图是某个时间段内⽣成的登录token记录,就是每次有⼈登录系统都会⽣成这样⼀条记录,数据量还是挺⼤的。
汇总了⽹站上线第⼀周的 token 产⽣数据情况,如下图所⽰:通过这个数据可以⼤致的推算出⼀些结果,每天⼤概有 200 ~ 300 ⼈登录并测试了 这个项⽬。
vu2和vue3的区别Vue.js(通常称为Vue)是一个流行的JavaScript框架,用于构建用户界面。
您提到的"vu2" 和"vue3" 分别指的是Vue 2 和Vue 3,它们是Vue.js 的不同版本,有一些重要的区别:1. 性能优化:- Vue 3 在性能方面进行了重大优化。
它引入了一种称为“Proxy”的新的响应式系统,以及更高效的虚拟DOM算法。
这些改进使Vue 3在处理大型和复杂的应用程序时比Vue 2更快。
2. Composition API:- Vue 3引入了Composition API,这是一个新的API,旨在改善代码的可维护性和可重用性。
它允许您将组件逻辑组织为功能组合,而不仅仅是选项对象。
这使得编写复杂组件更容易,并且代码更易于测试和理解。
3. Teleport:- Vue 3引入了Teleport,这是一个新的功能,允许您将组件的一部分呈现到DOM中的不同位置。
这对于创建弹出窗口和模态框等复杂的UI组件非常有用。
4. Fragments:- Vue 3允许您使用片段(Fragments)来返回多个根元素,而不像Vue 2那样必须有一个根元素。
5. TypeScript支持:- Vue 3对TypeScript的支持更加出色,使得在TypeScript项目中使用Vue更加容易,并提供更好的类型推断。
6. 自定义渲染器:- Vue 3引入了自定义渲染器API,允许您将Vue用于不同的渲染目标,例如移动应用、桌面应用或静态站点生成。
7. 代码大小:- Vue 3的代码大小相对较小,这有助于减小应用程序的文件大小,提高加载性能。
需要注意的是,Vue 3与Vue 2的一些API和用法可能有所不同,因此从Vue 2升级到Vue 3可能需要进行一些修改和适应。
选择使用哪个版本取决于您的项目需求和团队的熟悉程度,但一般来说,Vue 3提供了更好的性能和开发体验。
谷歌插件 mv2的写法谷歌插件 mv2 是一种用于谷歌浏览器的扩展程序,提供了许多实用的功能,例如广告拦截、页面翻译等。
下面就介绍一下如何编写一个简单的 mv2 插件。
首先,我们需要一个 manifest.json 文件,用于描述插件的基本信息和权限。
一个最基本的文件内容如下:```{"manifest_version": 2,"name": "My Extension","version": "1.0","description": "A simple example extension","permissions": ["activeTab"],"browser_action": {"default_icon": "icon.png","default_popup": "popup.html"}}```其中,manifest_version 表示插件的 manifest 版本号,这里固定为2;name 是插件的名字;version 是版本号;description 是描述信息;permissions 是插件需要的权限,例如此处需要访问当前标签页;browser_action 则用于定义插件的图标和弹出页面等信息。
接下来,我们需要一个 popup.html 文件,用于定义插件弹出的页面内容。
一个最简单的页面内容如下:```<!DOCTYPE html><html><head><title>Hello World!</title></head><body><h1>Hello World!</h1></body></html>```在 popup.html 文件中,我们可以使用 HTML、CSS 和 JavaScript 等网页技术来定义插件的弹出页面内容。
Core微信⽀付(⼀)【统⼀下单APIV3】官⽅参考资料⾸先声明,我这个是为APP⽀付提供的接⼝其他端使⽤时仅供参考!!本地调试时记得安装微信⽀付安全证书发布到服务器上也要安装微信⽀付安全证书私钥从微信⽀付后台发放的证书中拷贝出来 ⼀、签名 ⽣成签名⾥⾯讲的⽐较详细,也有官⽅的⽂档,不过⽂档不全,导致我的调试程序⼀直出现问题,请求微信的总是报400错误(Bad Request)。
签名⽣成参考,代码如下,⾥⾯有我标注的请求接⼝报400错误原因的代码using System;using System.IO;using .Http;using System.Security.Cryptography;using System.Threading;using System.Threading.Tasks;namespace HttpHandlerDemo{// 使⽤⽅法// HttpClient client = new HttpClient(new HttpHandler("{商户号}", "{商户证书序列号}"));// ...// var response = client.GetAsync("https:///v3/certificates");public class HttpHandler : DelegatingHandler{private readonly string merchantId;private readonly string serialNo;public HttpHandler(string merchantId, string merchantSerialNo){InnerHandler = new HttpClientHandler();this.merchantId = merchantId;this.serialNo = merchantSerialNo;}protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken){var auth = await BuildAuthAsync(request);string value = $"WECHATPAY2-SHA256-RSA2048 {auth}";request.Headers.Add("Authorization", value);request.Headers.Add("Accept", "application/json");//如果缺少这句代码就会导致下单接⼝请求失败,报400错误(Bad Request)request.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");//如果缺少这句代码就会导致下单接⼝请求失败,报400错误(Bad Request)return await base.SendAsync(request, cancellationToken);}protected async Task<string> BuildAuthAsync(HttpRequestMessage request){string method = request.Method.ToString();string body = "";if (method == "POST" || method == "PUT" || method == "PATCH"){var content = request.Content;body = await content.ReadAsStringAsync();//debug的时候在这⾥打个断点,看看body的值是多少,如果跟你传⼊的参数不⼀致,说明是有问题的,⼀定参考我的⽅法}string uri = request.RequestUri.PathAndQuery;var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();string nonce = Path.GetRandomFileName();string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";string signature = Sign(message);return $"mchid=\"{merchantId}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{serialNo}\",signature=\"{signature}\"";}protected string Sign(string message){// NOTE:私钥不包括私钥⽂件起始的-----BEGIN PRIVATE KEY-----// 亦不包括结尾的-----END PRIVATE KEY-----string privateKey = "{你的私钥}";byte[] keyData = Convert.FromBase64String(privateKey);using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))using (RSACng rsa = new RSACng(cngKey)){byte[] data = System.Text.Encoding.UTF8.GetBytes(message);return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));}}}} ⼆、统⼀下单 使⽤⽅法var url = "https:///v3/pay/transactions/app";var req = new GenerateOrderModelForWxPay{appid = WxPayConst.appid,mchid = WxPayConst.mchid,description = "商品名称",amount = new WxPayAmountModel{total = 1},out_trade_no = orderNumber,notify_url = "https:///api/WxPayCallback"};HttpClient client = new HttpClient(new HttpHandler("{商户号}", "{商户证书序列号}"));//GET ⽅式var response = client.GetAsync("https:///v3/certificates");// POST ⽅式var bodyJson = new StringContent(req.ToJson(), Encoding.UTF8, "application/json"); //⼀定要这样传递参数,不然在加密签名的时候获取到的参数就是\\u0这种形式的数据了,不是传递的这样的数据了,导致加密的结果不正确var response = await client.PostAsync(url, bodyJson);// 读取统⼀下单之后的返回结果,这样读取出来的直接就是结果,或者错误原因,⼤家⼀定要这么搞啊多么痛的领悟,会有具体的错误信息的。
数据传输⽤⼾指南·法律声明法律声明阿⾥云提醒您在阅读或使⽤本⽂档之前仔细阅读、充分理解本法律声明各条款的内容。
如果您阅读或使⽤本⽂档,您的阅读或使⽤⾏为将被视为对本声明全部内容的认可。
1. 您应当通过阿⾥云⽹站或阿⾥云提供的其他授权通道下载、获取本⽂档,且仅能⽤于⾃⾝的合法合规的业务活动。
本⽂档的内容视为阿⾥云的保密信息,您应当严格遵守保密义务;未经阿⾥云事先书⾯同意,您不得向任何第三⽅披露本⼿册内容或提供给任何第三⽅使⽤。
2. 未经阿⾥云事先书⾯许可,任何单位、公司或个⼈不得擅⾃摘抄、翻译、复制本⽂档内容的部分或全部,不得以任何⽅式或途径进⾏传播和宣传。
3. 由于产品版本升级、调整或其他原因,本⽂档内容有可能变更。
阿⾥云保留在没有任何通知或者提⽰下对本⽂档的内容进⾏修改的权利,并在阿⾥云授权通道中不时发布更新后的⽤⼾⽂档。
您应当实时关注⽤⼾⽂档的版本变更并通过阿⾥云授权渠道下载、获取最新版的⽤⼾⽂档。
4. 本⽂档仅作为⽤⼾使⽤阿⾥云产品及服务的参考性指引,阿⾥云以产品及服务的“现状”、“有缺陷”和“当前功能”的状态提供本⽂档。
阿⾥云在现有技术的基础上尽最⼤努⼒提供相应的介绍及操作指引,但阿⾥云在此明确声明对本⽂档内容的准确性、完整性、适⽤性、可靠性等不作任何明⽰或暗⽰的保证。
任何单位、公司或个⼈因为下载、使⽤或信赖本⽂档⽽发⽣任何差错或经济损失的,阿⾥云不承担任何法律责任。
在任何情况下,阿⾥云均不对任何间接性、后果性、惩戒性、偶然性、特殊性或刑罚性的损害,包括⽤⼾使⽤或信赖本⽂档⽽遭受的利润损失,承担责任(即使阿⾥云已被告知该等损失的可能性)。
5. 阿⾥云⽹站上所有内容,包括但不限于著作、产品、图⽚、档案、资讯、资料、⽹站架构、⽹站画⾯的安排、⽹⻚设计,均由阿⾥云和/或其关联公司依法拥有其知识产权,包括但不限于商标权、专利权、著作权、商业秘密等。
⾮经阿⾥云和/或其关联公司书⾯同意,任何⼈不得擅⾃使⽤、修改、复制、公开传播、改变、散布、发⾏或公开发表阿⾥云⽹站、产品程序或内容。
tagParam[i] = t;}int i = PushManager.getInstance().setTag(context,tagParam, System.currentTimeMillis() +"");String text = "设置标签失败,未知异常";switch (i) {case PushConsts.SETTAG_SUCCESS:text = "设置标签成功";break;case PushConsts.SETTAG_ERROR_COUNT:text = "设置标签失败, tag数量量过⼤大, 最⼤大不不能超过200个"; break;case PushConsts.SETTAG_ERROR_FREQUENCY:text = "设置标签失败, 频率过快, 两次间隔应⼤大于1s";break;case PushConsts.SETTAG_ERROR_REPEAT:text = "设置标签失败, 标签重复";break;case PushConsts.SETTAG_ERROR_UNBIND:text = "设置标签失败, 服务未初始化成功";break;case PushConsts.SETTAG_ERROR_EXCEPTION:text = "设置标签失败, 未知异常";break;case PushConsts.SETTAG_ERROR_NULL:text = "设置标签失败, tag 为空";break;case PushConsts.SETTAG_NOTONLINE:text = "还未登陆成功";break;case PushConsts.SETTAG_IN_BLACKLIST:text = "该应⽤用已经在⿊黑名单中,请联系售后⽀支持!";break;case PushConsts.SETTAG_NUM_EXCEED:text = "已存 tag 超过限制";break;。
php微信⽀付v3版签名⽣成,代⾦券、微信⽀付分、⽀付即服务等对接微信新版SDKv3版签名⽣成规则,微信的官⽅⽂档⾥⾯说明的还算可以吧,不过个⼈觉得不太理想- -。
⾃⼰调试的时候调试了半天才找了错误原因。
https://wechatpay-api.gitbook.io/wechatpay-api-v3微信v3接⼝更换了新版签名⽅式 商户需要使⽤⾃⾝的私钥对API URL、消息体等关键数据的组合进⾏SHA-256 with RSA签名。
请求的签名信息通过HTTP头Authorization传递,具体说明请见。
没有携带签名或者签名验证不通过的请求,都不会被执⾏,并返回401 Unauthorized。
官⽅有给提供了类库和SDK不过我这⾥是旧项⽬没有⽤着composer,使⽤官⽅提供的话需要改动太⼤,所以这⾥就⾃⼰做了⼀个简单的封装,所以不清楚官⽅提供的库具体如何。
//⽣成v3 Authorizationprotected function createAuthorization( $url , $method = 'GET' ){if (!in_array('sha256WithRSAEncryption', \openssl_get_md_methods(true))) {throw new \RuntimeException("当前PHP环境不⽀持SHA256withRSA");}$url_parts = parse_url($url);$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));//私钥地址$mch_private_key = $this->mch_private_key;//商户号$merchant_id = $this->mch_id;//当前时间戳$timestamp = time();//随机字符串$nonce = $this->createNoncestr();//POST请求时需要转JSON字符串$body = $this->body ;$message = "{$method}\n".$canonical_url."\n".$timestamp."\n".$nonce."\n".$body."\n";//⽣成签名openssl_sign($message, $raw_sign, openssl_get_privatekey(file_get_contents($mch_private_key)), 'sha256WithRSAEncryption');$sign = base64_encode($raw_sign);//Authorization 类型$schema = 'WECHATPAY2-SHA256-RSA2048';//⽣成token$token = sprintf('mchid="%s",serial_no="%s",nonce_str="%s",timestamp="%d",signature="%s"', $merchant_id,$this->serial_no, $nonce, $timestamp, $sign);$header = ['Content-Type:application/json','Accept:application/json','User-Agent:*/*','Authorization: '. $schema . ' ' . $token];return$header;}/*** 作⽤:产⽣随机字符串,不长于32位*/public function createNoncestr( $length = 32 ){$chars = "abcdefghijklmnopqrstuvwxyz0123456789";$str ="";for ( $i = 0; $i < $length; $i++ ) {$str.= substr($chars, mt_rand(0, strlen($chars)-1), 1);}return$str;}获取平台证书及平台证书序列号,加密解密,个别V3接⼝需要⽤到。
使用极光推送(www.jpush.cn)向安卓手机推送消息【服务端向客户端主送推送】,C#语言 在VisualStudio2010中新建网站JPushAndroid。添加引用json帮助类库Newtonsoft.Json.dll。 在web.config增加appkey和mastersecret,可以在极光官网www.jpush.cn申请。web.config源码:
添加类JPushV3,会弹出保存类在App_code文件夹下,确定。 JpushV3代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net; using System.Text; using System.IO; using System.Configuration; using System.Collections;
/* * 参考文档:http://docs.jpush.cn/display/dev/Index 选择里面的:服务器端 API,Push-API-V3 * * 极光推送的网站的网址是:https://www.jpush.cn/ * 旧版本V2 http://docs.jpush.cn/display/dev/Push+API+v2 * 最新版本V3 http://docs.jpush.cn/display/dev/Push-API-v3 * * 其中服务端的接口以及示例代码都在这里:http://docs.jpush.cn/display/dev/Server-SDKs */
/// /// 极光推送的最新版:PUSH-API-V3 /// 参考地址 http://docs.jpush.cn/display/dev/Push-API-v3 /// POST https://api.jpush.cn/v3/push /// public class JPushV3 { /// /// 应用标识:极光推送的用户名 /// private readonly string AppKey = ConfigurationManager.AppSettings["AppKey"]; /// /// 极光推送的密码 /// private readonly string MasterSecret = ConfigurationManager.AppSettings["MasterSecret"]; /// /// 极光推送请求的url地址 /// private readonly string RequestUrl = "https://api.jpush.cn/v3/push"; /// /// 查询推送结果请求的Url地址 /// private readonly string ReceivedUrl = "https://report.jpush.cn/v3/received";
/// /// 发送推送请求到JPush,使用HttpWebRequest /// /// 传入POST或GET /// 固定地址 /// 用户名AppKey和密码MasterSecret形成的Base64字符串 /// 请求的json参数,一般由Platform(平台)、Audience(设备对象标识)、Notification(通知)、Message(自定义消息)、Options(推送可选项)组成 /// public string SendRequest(String method, String url, String auth, String reqParams) { string resultJson = "";
HttpWebRequest myReq = null; HttpWebResponse response = null; try { myReq = (HttpWebRequest)WebRequest.Create(url); myReq.Method = method; myReq.ContentType = "application/json"; if (!String.IsNullOrEmpty(auth)) { myReq.Headers.Add("Authorization", "Basic " + auth); } if (method == "POST") { byte[] bs = UTF8Encoding.UTF8.GetBytes(reqParams); myReq.ContentLength = bs.Length; using (Stream reqStream = myReq.GetRequestStream()) { reqStream.Write(bs, 0, bs.Length); reqStream.Close(); } } response = (HttpWebResponse)myReq.GetResponse(); HttpStatusCode statusCode = response.StatusCode;
if (Equals(response.StatusCode, HttpStatusCode.OK)) { using (StreamReader reader = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8)) { resultJson = reader.ReadToEnd(); try { object json = Newtonsoft.Json.JsonConvert.DeserializeObject(resultJson); } catch { resultJson = string.Format("{{\"error\": {{\"message\": \"{0}\", \"code\": 10086}}}}", "响应的结果不是正确的json格式"); } } } } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ProtocolError) { HttpStatusCode errorCode = ((HttpWebResponse)ex.Response).StatusCode; string statusDescription = ((HttpWebResponse)ex.Response).StatusDescription; using (StreamReader sr = new StreamReader(((HttpWebResponse)ex.Response).GetResponseStream(), System.Text.Encoding.UTF8)) { resultJson = sr.ReadToEnd(); //{"errcode":404,"errmsg":"request api doesn't exist"} Dictionary dict = JsonToDictionary(resultJson); string errCode = "10086"; string errMsg = "发送推送的请求地址不存在或无法连接"; if (dict.ContainsKey("errcode")) { errCode = dict["errcode"].ToString(); } if (dict.ContainsKey("errmsg")) { errMsg = dict["errmsg"].ToString(); } resultJson = string.Format("{{\"error\": {{\"message\": \"{0}\", \"code\": {1}}}}}", errMsg, errCode); } } else { //这里一定是error作为键名(自定义错误号10086),和极光推送失败时的json格式保持一致 如 {"error": {"message": "Missing parameter", "code": 1002}} resultJson = string.Format("{{\"error\": {{\"message\": \"{0}\", \"code\": 10086}}}}", ex.Message.Replace("\"", " ").Replace("'", " ")); } } catch (System.Exception ex) { resultJson = string.Format("{{\"error\": {{\"message\": \"{0}\", \"code\": 10086}}}}", ex.Message.Replace("\"", " ").Replace("'", " ")); } finally { if (response != null) { response.Close(); } if (myReq != null) { myReq.Abort(); }