微信支付10002请求类型163邮箱登陆非法请求怎么回事

集成微信支付时跳转到只有一个确定的页面--问题处理 - 简书
集成微信支付时跳转到只有一个确定的页面--问题处理
欢迎访问个人博客
不得不说微信支付的集成是个相当坑爹的事,相比之下,阿里的实在太好用了,但因为工作需要不得不集成WechatPay,但又不想借助第三方平台如Ping++之类的,那也只好硬着头皮上了
微信支付开发文档
这个容易,根据官方的开发文档一步步操作即可---&
遇到的问题
接下来才是最坑爹的事了,如下图所示。
几乎百分之五十的开发者都会遇到这样的情况,是的,跳转成功了,但支付界面只有一个“确定”按钮是什么鬼。而根据开发文档操作,只要有一个疏漏,就会导致这个结果,下面,我就将一些常见的疏漏整理一番,以供参考
1. appid一定不能错
这个问题一般是粗心所致,但只要appid填写错误(有多处用到appid,如注册微信支付功能、提交订单、查询订单等),便会导致支付后无法跳转回app,app里的支付回调无法正确执行等,所以一旦遇到问题,不妨先检查一下各处的appid是否正确。
2. 时间戳格式(int)
这个坑点十分容易忽视,一般来讲,不管是服务器传给你的,或是自己生成的时间戳,都是string类型,那么就需要进行转换,在值后加上intValue即可,官方Demo是个很好的参考实例,但往往会忽视一些细节。
3. sign签名
值得注意的是签名有两处,第一处是“统一下单”时由服务器生成的签名,这个在客户端用不上,客户端需要用到的是“提交订单”的sign,注意,第二个sign,能且只能由客户端生成!虽然不明原因,但只要用到服务端传过来的sign就会毫无悬念的出现只有一个确定按钮的错误界面,所以这个签名一定得客户端自己生成,生成方法十分简单,官方Demo里也有提供,为了大家方便我在这里也附上代码。
// MARK: -微信支付
func goWechat(response:OnCreateOrder) {
KohUserDefaultManager.SetLocalDataString(self.orderNo, key: KEY_PAY_ORDERNO)
let request = PayReq()
request.partnerId = response.partnerid
request.prepayId = response.prepayid
request.package = response.package
if request.prepayId != nil {
//获取到prepayid后进行第二次签名
//设置支付参数
let time_stamp = WXUtil.nowTime()
let nonce_str = WXUtil.md5(time_stamp)
//重新按提交格式组包,微信客户端暂只支持package=Sign=WXPay格式,须考虑升级后支持携带package具体参数的情况
= [NSString stringWithFormat:@"Sign=%@",package];
let package = "Sign=WXPay"
//第二次签名参数列表
let signParams = NSMutableDictionary()
signParams.setObject(response.appid, forKey: "appid")
signParams.setObject(nonce_str, forKey: "noncestr")
signParams.setObject(package, forKey: "package")
signParams.setObject(response.partnerid, forKey: "partnerid")
signParams.setObject(response.prepayid, forKey: "prepayid")
signParams.setObject(time_stamp, forKey: "timestamp")
//生成签名
let sign = WXUtil.createMd5Sign(signParams)
//添加签名
signParams.setObject(sign, forKey: "sign")
request.nonceStr = nonce_str
request.timeStamp = UInt32(time_stamp)!
request.sign = signParams["sign"] as? String
print(signParams)
let r = WXApi.sendReq(request)
if r == true {
KohDemoLog.instance().saveDemoLogInfo("提交微信支付请求成功", withDetail: nil)
个人博客:
更多分享,点击网址访问。健身/瑜伽/游泳
女式 赠品10002更多
更多HAPPY LANE产品:
好乐买价&&39
尺码对照表
请您放心挑选尺码,好乐买7天退换货为您畅享购物提供保障。
F 尺码对照表
商品编号:
尺码对照表
请您放心挑选尺码,好乐买7天退换货为您畅享购物提供保障。
尺码对照表
商品描述:好乐买-正品鞋服购物网站,为您提供浅棕色HAPPY LANE 10002女式赠品价格、用户评论、精彩图片等信息,网购HAPPY LANE赠品就上好乐买。
退换货保障
好乐买支持“15天内退换货”服务。自客户收到商品之日起(以系统签收日期为准)15日内可提出申请,所换商品仅限同款同色不同尺码。
贴身商品暂不支持此服务。文胸、背心、内裤、内衣套装、保暖内衣和内裤以及保暖内衣套装、泳装、袜子(包括丝袜、连裤袜、运动袜、打底裤),一经签收,非质量问题不予退换货,请您谅解。
限时特卖、秒杀商品仅支持退货服务。
特殊商品退换货说明:
1. 限时特卖、秒杀商品仅支持“签收后15日内退货”服务;全球购商品仅支持“签收后7日内退货”服务;
2. 贴身商品出于安全及卫生考虑,一经签收,非质量问题不予退换。此类商品包括但不仅限于:文胸、背心、内裤、内衣套装、保暖内衣及内裤、保暖内衣套装、泳装、袜子(包括丝袜、连裤袜、运动袜、打底裤)等;
3. 数码配件类商品原厂包装已打开,一次性封贴或胶条破损,非质量问题不予退换货;
4. 值区商品因价格远低于市场价格出售,订单付款成功后,不可取消并且不提供退换货及维修服务,敬请体谅;
退换货费用
质量问题退换货,好乐买承担商品寄回运费(上限20元)。
更多详细信息请查看
订单支付成功后,好乐买将在第一时间匹配商品,为您安排发货。快递取件后,送达时间通常为3-5天左右,偏远地区加时1-2天。
由于商品发货及配送环节容易受到多方面因素影响,因此好乐买对您承诺的发货及收货时间仅限于正常情况,不作为最终承诺。比如法定节假日、异常天气或商品需要调拨时,发货及送达时间将会延迟,对此给您带来的不便,请您体谅!
好乐买目前仅支持在线支付
好乐买支持的网上银行详细请查看
好乐买价(中间未划横线价格):好乐买价为商品的销售价,该价格是交易成交价,是您最终决定是否购买商品的依据。
划线价:商品展示的划横线价格为参考价,该价格可能是品牌专柜标价、商品吊牌价或由品牌供应商提供的正品零售价(如厂商指导价、建议零售价等);由于地区、时间的差异性和市场行情波动,品牌专柜标价、商品吊牌价等可能会与您购物时展示的不一致,该价格仅供您参考。
折扣比:为好乐买销售价与参考价的对比(该值四舍五入后采小数点后1位,如¥799/¥6=2.8折),该对比值仅供您参考,不作为结算基数。
好乐买官方微信
关注官方微信,订单状态随时查。
天津好乐买信息技术有限公司
Copyright & 2007- All Rights Reserved&&京公网安备 & 客服电话:400-57616人阅读
微信公众号开发
& & & & 这段时间在做微信支付开发,在公司的公众号审批下来后,我这边的测试用例也已经开发完毕,于是拿着具体的数据来调试了,大段大段的代码就不贴了,demo里有,这里就说说调试过程中遇到的坑。
& & & & 第一坑:redirect_url参数错误。因为我选择的的“JS API”支付,这种支付需要网页授权,先获取code,再拿code去获取openid和prepay_id。这个网页授权需要登录微信公众平台,点击左侧菜单“开发者中心”,在右侧“权限列表”中找到“网页账号”,点击最右侧的修改,把测试的网址写进去,注意不要加http。填好后,这个坑就趟过去了。
& & & & 第二坑:invalide code。趟过第一坑后,会返回code,再拿此code去获取openid,但是每次到这步时微信那边都返回这个{&errcode&:40029,&errmsg&:&invalid code&},此坑卡了我整整半个下午。在周天的时候,我又仔细看了开发文档,没得要领,最后又仔细检查了下程序中每次回调的参数。这一检查,就发现要领了,先把回调地址写的最简单,啥参数都不带,成功;接着,一个一个参数带上去,直到带上token这个参数时,返回了invalid code。哈,我猜应该是此参数和微信那边有冲突吧,于是把此参数改成了其他的,此坑立马就过了,接下来支付就一下子调试成功。
& & & & 第三坑:系统繁忙,正在升级,请稍后再试。周末调试成功后,便把测试代码整合到项目中,开始支付。但是到了支付界面时,便出现了此问题,怎么找到都发现不了问题,点击周末的测试链接又是好的。下午时又仔细看了下上下游的的传递的参数,发现了问题所在。每次上游传递过来的支付金额total_fee都是“1.00”这种类型,因为微信支付的基本单位是分,于是把手动把1.00该为1,成功了。看来是微信支付那边total_fee不能接收小数点,于是我和上游的同事协调了下,传递过来的金额没有小数点,此坑也就过了。
& & & & 【更新 】
& & & & 今天测试发现在iphone4上,支付不成功,于是进入测试机调试,发现问题出在第一坑中,把body参数去掉,就ok了,看来在微信支付时,最好少带参数。&
& & & & &【更新 】
& & & & &下午,QA说微信支付又不成功了,提示“统一支付接口中,缺少必填参数openid!trade_type为JSAPI时,openid为必填参数!”。我进入测试机中调试,发现服务器中curl请求微信平台返回的都是NULL,提示不管用,接着又打印curl的报错信息,输出为77,去查询了下,提示是SSL证书的问题,于是我在服务器重新安装了证书,并重启了php-fpm,之后便能支付了。
sudo yum install ca-certificates
service php-fpm restart
& & & &&【更新 】
& & & & 今天支付接入了商城相关逻辑,写完后,我又测试了以前的会员卡支付的,发现在支付阶段提示失败,于是加上测试语句,提示“getBrandWCPayRequest:fail_no permission to execute”(注:iphone5s手机),后来找到了部小米的,进入支付提示“system:access_denied”,进入文档一查,原来是授权目录错误,改回来后就好了,应该是QA在年前改的,折腾。
& & & &&【更新 】
& & & & 上午看到QA在禅道又提了个关于微信支付的bug,说是报“package中的参数partner或者prepay_id为空”的错误。于是我轻车熟路的进入到调试模式,经过几次测试,发现微信支付一旦超过十万便会出现上述提示,若是打上断点调试语句的话,会发现微信返回{&errcode&:&FAIL&,&errmsg&:&invalid total_fee&}。知道微信支付额度上限,那么只需在后台设置最大不超过十万即可。
一共有3位博乐进行推荐
不错,总结实际开发中遇到问题。要是能针对遇到的问题详细地讲讲具体的解决方法的话,相信会是大家所需要的,关注的人也会更多。
好文章,能让很多人少走很多弯路;大段大段的代码就不贴了,demo里有,是指官方提供的demo吗?
不错,总结实际开发中遇到问题。要是能针对遇到的问题详细地讲讲具体的解决方法的话,相信会是大家所需要的,关注的人也会更多。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:297343次
积分:3692
积分:3692
排名:第7208名
原创:135篇
评论:88条23175人阅读
项目中可圈可点的技术
ASP.NET(28)
  前2天,做一个手机网页的微信支付的项目,费了好些周折,记录一下。接下来,按照开发步骤,细数一下,我遇到的那些坑。
【坑1】官方邮件中下载的demo只有PHP版本,其他版本没有给链接。可能让人误以为只有PHP版本,事实上,各种版本都有。
拿到了腾讯发给客户的,微信支付商户资料,邮件中提示:证书的详细使用方案,请查看。根据邮件的链接,定向到一个新的邮件附件,里面的内容:
  3. 使用公众号发起支付请求
  使用JS API在微信的网页中发起支付请求,详细方法见文档中有关JS API的章节。
  微信支付接口文档及demo(公众账号).zip
微信支付接口文档及demo(公众账号).zip,下载以后包含
  【微信支付】微信公众号支付接口文档V3.3.7
  公众账号支付DEMO,只有PHP版。
之前看到别人说,为什么现在很多微信公众平台项目都用PHP开发,因为腾讯官方的Demo很多只给了PHP版本,心里暗骂,怎么微信支付这么重要的东西也只给PHP版,哎,先把PHP版本跑通吧。于是在本地配置PHP环境,修改给的demo的配置参数。运行demo,看到请在微信客户端中打开链接的提示,于是把它部署到朋友服务器,在微信中去测试,结果,报一个json扩展方法不支持,于是去搜索,怎么配置这个扩展方法。到晚上12点了,睡觉了,没搞好。临睡前想的是,PHP版本就算支付走通了,更新订单状态的代码也不好搞呀,逻辑比较复杂,用PHP再写一遍很烦人,我PHP基本不会。
这里走弯路了,其实是有.net版本的demo的,无意间在公众平台的后台点击链接看到了,大喜过望,SDK下载-&,JAVA,.NET
C#,PHP,IOS,Android都有。幸福的下载.NET版。
.NET版本Demo第一处修改:default.aspx页面里面的链接路径,居然都指向到paysdk.,改成自己的路径后,还是运行报错,因为下面的坑:
【坑2】代理服务器设置,注释就可以了,lib\HttpService.cs中get和post方法里。
         //下面设置HttpWebRequest的相关属性
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = &POST&;
request.Timeout = timeout * 00;//默认传过来是6秒,手动加了一分钟
//设置代理服务器
//WebProxy proxy = new WebProxy();
//定义一个网关对象
//proxy.Address = new Uri(WxPayConfig.PROXY_URL);
//网关服务器端口:端口
//request.Proxy =
【坑3】redirect_url参数错误,网页授权-&网页账号,填写域名。
因为我选择的的“JS API”支付,这种支付需要网页授权,先获取code,再拿code去获取openid和prepay_id。这个网页授权需要登录微信公众平台。点击左侧菜单“开发者中心”,在右侧“权限列表”中找到“网页账号”,点击最右侧的修改,把测试的域名写进去,注意不要加http。经过测试发现,域名必须完全匹配,设置顶级域名,程序是的二级域名都不行。
微信公众平台登陆还要微信管理员在个人微信号上授权,要等客户公司员工上班了,才授权,增加了解决问题等待的时间。
【坑4】&数据类型要和接口文档要求的完全一致。报错:ERROR&下单失败,WxPayData字段数据类型错误
项目中的订单编号是long类型,微信接口规范是string类型,报了上面的错误,改为string类型就好了。这个属于需要注意的,严格来说,不能算坑
趟过上面的几个坑,终于支付成功了。接下来,要去完成更新订单的逻辑。
ResultNotify页面更新订单的逻辑并没有按照预料的走,查看IIS的日志,微信有发请求到ResultNotify页面,状态是500内部服务器错误。网站程序的Log中并没有记录到,一步一步用Log.Debug,记录程序走的情况,发现微信订单号应该成功获取到了,并且验证签名成功,返回的XML也正常。
INFO WxPayAPI.ResultNotify: Check sign success
DEBUG WxPayApi: OrderQuery response : &xml&&return_code&&![CDATA[SUCCESS]]&&/return_code&
&return_msg&&![CDATA[OK]]&&/return_msg&
&total_fee&10&/total_fee&
于是,在关键代码处,添加了try catch,这一步早就应该做,就不用一步一步的试错了,走弯路了,异步通知页面的找出错误很麻烦,要支付一次,看响应的结果。接下来,有依次经历了以下几个异常。
&【坑5】ERROR WxPayAPI.ResultNotify: 更新订单的时候发生异常:该字符串未被识别为有效的 DateTime
&time_end&&![CDATA[17]]&&/time_end&
这一步,我直接写DateTime.Parse转换的,抛异常,后来改写为DateTime.ParseExact方法,解决问题,注意format是yyyyMMddHHmmss,不明白为什么HH也要大写,不然也报错。
DateTime payDate = notifyData.IsSet(&time_end&) ? DateTime.ParseExact(notifyData.GetValue(&time_end&).ToString(), &yyyyMMddHHmmss&, System.Globalization.CultureInfo.CurrentCulture) : DateTime.MinV
改了以后,抛出的异常是&更新订单的时候发生异常:正在中止线程在 System.Threading.Thread.AbortInternal(),这个百思不得琪姐。百度搜索一般是Response.Redirect和Server.Transfer导致线程终止,也没找到类似的问题。一行一行过代码发现以下Bug.
【坑6】微信支付的单位是分,一般网站单位是元。而且微信的total_fee不能接收小数点,不能是0.1分钱。
我的更新订单程序有一行if (orderAmount == payAmount){}一个是微信获取到的单位是分,一个是网站的,单位是元,这个坑也浪费了好久时间,一行一行过代码才发现,因为是逻辑错误。幸好有这个判断,否则钱相差100倍,天大的BUG。
这个BUG改好以后,订单状态被成功的更新了。&
微信做的比较人性化的是,设置测试目录以及微信号白名单,测试期间,只有白名单中的微信号才能支付。部署到给客户测试,测试没有问题后,部署到的时候,居然又报redirect_url参数错误,看到微信提示说,测试目录不能和正式目录一样,否则会支付失败,我测试目录是/wxpay/,正式目录是/wxpay/,难道wxpay的文件夹名称也不能一样?没道理呀,把测试目录改成其他的,还是不对。搜索了一下,恍然大悟,是【坑3】导致的。之前把网页账号的域名改为了,改为,成功支付。注意:域名要完全匹配,程序在,网页账号设置一样报redirect_url参数错误。
至此,微信支付JS API调用整个流程完成,相对于支付宝Wap支付来说,花的时间更多。
1.对于第一个坑,是否有.net版,一般各种版本都会有,如果没有及时的发现.net版,用PHP去开发,那对于我来说,工作量就更大了。应该仔细的看官方各种帮助文档,也许它藏的比较深。
其实支付接口的主要逻辑,官方都做好了,重点是配置。
这里不得不说,腾讯随邮件发送的Demo下载包含各种版本网页路径,不是更好吗?
2.仔细看接口文档,先过一遍程序,自己去找潜在的问题,有利于提升分析问题的能力,如果时间紧急,请看3。
3.如果自己确定应该没有什么问题了,而没有预期工作,那么要去找出问题。
3.1 判断是不是微信端的error,在关键位置加日志,微信的demo中,可以设置输入Log的级别,测试的时候输出debug,Info,error,正式环境可以设置只输出error,这一点很赞。
3.2 自己代码的BUG: 整段代码加try...catch,把异常信息保存到日志中去,这样能快速的找出问题。try catch不用多说了,标配。
3.3 异常容易捕获,如果是逻辑错误,需要细心的过代码。
官方demo,先跳转到example/ProductPage.aspx,这个页面主要是调用【网页授权获取用户信息】接口获取用户的openid,点击按钮的时候,跳转到JsApiPayPage.aspx页面,传递openid和total_fee支付金额过去,其中用ViewState保存openid是个槽点,web app尽量不要用ViewState和服务器控件,它们会生成臃肿的HTML,增加网络流量,影响加载速度,你要知道,手机如果是在GSM网络下访问站点,多一些文本都是压力,尽可能精简。
直接把获取openid的逻辑写到JsApiPayPage页面就好了,省的多跳转一个页面,后台代码是要验证授权,然后获取到前台JS API调用需要的参数wxJsApiParam。
public partial class JsApiPayPage : BaseOnlineSend
public static string wxJsApiParam {} //H5调起JS API参数
protected void Page_Load(object sender, EventArgs e)
(this.GetType().ToString(), &page load&);
if (!IsPostBack)
JsApiPay jsApiPay = new JsApiPay(this);
jsApiPay.GetOpenidAndAccessToken();
string openid = jsApiPay. ;
OrderDetail = this.D
//付款金额
decimal total_fee = OrderDetail.TotalOrderAmount + OrderDetail.TotalLogisticsFee + OrderDetail.OrderAmountRevise + OrderDetail.LogisticsFeeR
//检测是否给当前页面传递了相关参数
if (string.IsNullOrEmpty(openid) || total_fee &= 0)
Log.Error(this.GetType().ToString(), &This page have not get params, cannot be inited, exit...&);
//若传递了相关参数,则调统一下单接口,获得后续相关接口的入口参数
jsApiPay.total_fee = (int)(total_fee * 100);//单位是分,不能有小数
jsApiPay.orderId = this.OrderID.ToString();
jsApiPay.siteName = this.GetConfig(&SiteName&);
//JSAPI支付预处理
WxPayData unifiedOrderResult = jsApiPay.GetUnifiedOrderResult();
wxJsApiParam = jsApiPay.GetJsApiParameters();//获取H5调起JS API参数
Log.Debug(this.GetType().ToString(), &wxJsApiParam : & + wxJsApiParam);
catch(Exception ex)
Response.Write(&&span style='color:#FF0000;font-size:20px'&& + &下单失败,请返回重试& + &&/span&&);
Log.Error(this.GetType().ToString(), &下单失败,& + ex.Message +&;& +ex.StackTrace);
其中,主要需要注意的是jsApiPay.total_fee,单位是分,要和自己项目的单位进行换算一些,否则会出错。
前台,页面加载之后,直接调用微信JS api 支付,支付完成后,直接在本页面显示支付结果。如果支付失败,让人家可以点击按钮尝试重新支付。
&script type=&text/javascript&&
//调用微信JS api 支付
function jsApiCall()
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
&%=wxJsApiParam%&,//josn串
function (res)
WeixinJSBridge.log(res.err_msg);
if(res.err_msg == &get_brand_wcpay_request:ok& ) {
document.getElementById(&payFail&).style.display=&none&;
document.getElementById(&paySuccess&).style.display=&block&;
document.getElementById(&payFail&).style.display=&block&;
function callpay()
//官方代码,不贴了
callpay();
&dl class=&item_desc& id=&dlPayInfo&&
&dt class=&item_title&&&span class=&txt&&支付信息&/span&&/dt&
&dd class=&item_panel pl1&&
&span class=&title&&&%=this.OrderDetail.ProductNames %&&/span&
&dd class=&item_panel pl1&&
&span class=&title&&订单号:&/span&&span class=&selected com_c4&&&%=this.OrderID %&&/span&
&dd class=&item_select item_last&&
&div class=&title&&
&strong&应付金额: &/strong&&span class=&com_c4&&&%=OrderDetail.TotalOrderAmount + OrderDetail.TotalLogisticsFee + OrderDetail.OrderAmountRevise + OrderDetail.LogisticsFeeRevise %& 元&/span&
&dd class=&item_select& id=&paySuccess& style=&display:none&&
&div class=&title& style=&padding-left:3rem&&
&img src=&/images/onSuccess.gif& title=&支付成功& /&
&span class=&selected&&&b class=&big&&支付成功!&/b&&br /&
系统正在处理收款,订单状态可能会有1-5分钟的滞后,感谢您的耐心等待。&br /&
&a href=&/member/order/info1/&&查看订单&/a&&br /&&br /&
您还可以:&a href=&/&&继续购物&/a&&br /&&br /&
&br /&&br /&
&dd class=&item_select&id=&payFail& style=&display:none&&
&div class=&title item& style=&padding-left:2.0rem&&
&span class=&selected&&&b class=&big&&支付失败!&/b&&/span&
&div class=&btns& style=&margin-top:10px&&&a class=&com_btn_7& style=&padding:1cursor:& onclick=&callpay()&&重新支付&/a&&/div&
&div class=&title item& style=&padding-left:2.0rem&&
&span class=&selected&&
您可以查看微信交易记录。如果没有扣费,可以稍后尝试重新支付。如果已经扣费,请拨打客服电话联系我们
&br /&&br /&
如果多次重新支付还是遇到了问题,稍后您可以在登陆状态下,访问个人中心-&&a href=&/member/order/&&我的订单&/a&,为编号为&%=this.OrderID %&的订单付款,有多种支付方式供您选择
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:361769次
积分:3870
积分:3870
排名:第6725名
原创:102篇
评论:62条
(1)(1)(1)(2)(2)(3)(1)(5)(1)(2)(2)(1)(3)(2)(4)(2)(1)(1)(1)(1)(1)(2)(2)(2)(5)(3)(3)(4)(5)(2)(2)(6)(5)(6)(3)(7)(4)(2)(2)(3)(3)(1)(1)

我要回帖

更多关于 网易邮箱非法请求 的文章

 

随机推荐