這兩天接微信支付的SDK,遇到了一個天坑,微信文檔里面不寫清楚,demo里面也沒有,參數少了一個無法支付啊有沒有!有沒有!有沒有!
最后調試成功,得知真相的我眼淚掉下來。。。
先讓我們看看是什么情況:
--------------------------------------------------------我是分割線--------------------------------------------------------
預支付訂單那塊就不說了,基本上都沒問題,服務器會返回一個prepay_id預支付訂單號,拿到這個訂單號在接下來的支付操作中會用到。
根據微信的文檔還有demo顯示,支付的時候需要這幾個參數應該就夠了
/** 商家向財付通申請的商家id */ @property (nonatomic, retain) NSString *partnerId; /** 預支付訂單 */ @property (nonatomic, retain) NSString *prepayId; /** 隨機串,防重發 */ @property (nonatomic, retain) NSString *nonceStr; /** 時間戳,防重發 */ @property (nonatomic, assign) UInt32 timeStamp; /** 商家根據財付通文檔填寫的數據和簽名 */ @property (nonatomic, retain) NSString *package; /** 商家根據微信開放平台文檔對數據做的簽名 */ @property (nonatomic, retain) NSString *sign;
看着沒什么問題吧,把前面幾個參數用字典序拼接,然后用key加密就生成sign了是吧,是不是都這么認為的?
no!圖樣圖森破!!!
如果你按照這樣簽名去支付的話,會看到這樣的界面
不明真相的你一定會一臉懵比
誰曾想,微信這個大坑X!要簽名的參數還差一個appid!把這個參數拼接簽名之后,再次跳轉微信支付就會有相應的訂單信息了。
代碼如下:
PayReq *payRequest = [[PayReq alloc] init]; payRequest.partnerId = @"13473*****"; payRequest.prepayId = prepayid; payRequest.nonceStr = [NSString randomString]; payRequest.timeStamp = [ZHDeviceModel shareModel].timesStamp.doubleValue / 1000; payRequest.package = @"Sign=WXPay"; NSDictionary *params = @{@"partnerid" : payRequest.partnerId, @"prepayid" : payRequest.prepayId, @"noncestr" : payRequest.nonceStr, @"timestamp" : [NSNumber numberWithInt:payRequest.timeStamp], @"package" : payRequest.package, @"appid" : @"wxa8a4*********", }.mutableCopy; payRequest.sign = [[MD5Model wChatSignedStringWithDic:params] uppercaseString]; [WXApi sendReq:payRequest];