iOS微信支付的那些坑

前言

一直以為支付寶的文檔寫的已經(jīng)夠爛了庸疾,后來我才發(fā)現(xiàn)我太年輕了锦聊,那是因?yàn)槲疫€沒有遇到微信的文檔,簡直坑爹享甸。截碴。。<心中一萬只草泥馬...>

  1. 支付業(yè)務(wù)流程
商戶系統(tǒng)和微信支付系統(tǒng)主要交互說明:
步驟1:用戶在商戶APP中選擇商品枪萄,提交訂單隐岛,選擇微信支付。
步驟2:商戶后臺收到用戶支付單瓷翻,調(diào)用微信支付統(tǒng)一下單接口聚凹。參見【[統(tǒng)一下單API](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_1)】。
步驟3:統(tǒng)一下單接口返回正常的prepay_id齐帚,再按簽名規(guī)范重新生成簽名后妒牙,將數(shù)據(jù)傳輸給APP。參與簽名的字段名為appId对妄,partnerId湘今,prepayId,nonceStr剪菱,timeStamp摩瞎,package拴签。注意:package的值格式為Sign=WXPay
步驟4:商戶APP調(diào)起微信支付。api參見本章節(jié)【[app端開發(fā)步驟說明](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5)】
步驟5:商戶后臺接收支付通知旗们。api參見【[支付結(jié)果通知API](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_7)】
步驟6:商戶后臺查詢支付結(jié)果蚓哩。,api參見【[查詢訂單API](https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=9_2)】
Paste_Image.png

注意

1.微信支付現(xiàn)在已經(jīng)很便捷了上渴,提供了統(tǒng)一下單接口岸梨,自己的后臺服務(wù)器調(diào)用該接口,獲取prepayId
2.最重要的一步稠氮,也是網(wǎng)上現(xiàn)在坑最多的一步曹阔,調(diào)用統(tǒng)一下單接口后,微信返回格式如下隔披,而這么多數(shù)據(jù)中赃份,真正對我們有用的只有 預(yù)支付訂單號prepayId,微信返回的sign沒有任何用锹锰,我們得根據(jù)簽名規(guī)范重新生成簽名(關(guān)于這點(diǎn)芥炭,上面的流程交互中就有提到),然后將重新生成的簽名返回給APP端恃慧,用于APP端調(diào)用微信支付园蝠。(當(dāng)然重新生成簽名的步驟也可以放在APP端來做,不過為了安全考慮痢士,建議放在服務(wù)端處理彪薛,下面也會(huì)給出APP端簽名的代碼)

調(diào)用統(tǒng)一下單接口 微信返回?cái)?shù)據(jù)
一定要重新生成簽名

Tip

很多人都遇到這樣的問題,參數(shù)都處理好調(diào)用微信支付怠蹂,結(jié)果進(jìn)入微信界面后發(fā)現(xiàn)只有一個(gè)確定按鈕善延,返回后錯(cuò)誤碼為 -2,造成這個(gè)原因的就是因?yàn)閰?shù)不對城侧,而且大多是都是因?yàn)楹灻?sign 不對易遣,沒有進(jìn)行二次簽名,而直接拿微信返回的sign當(dāng)作參數(shù) 嫌佑, 所以調(diào)用微信支付接口時(shí)豆茫,一定要用 重新簽名的sign!N菀 ?辍!

  • APP端調(diào)用支付時(shí)炮温,sign不要用調(diào)用統(tǒng)一下單接口返回的sign,而要自己重新生成火脉,生成規(guī)則見微信提供的簽名生成算法
    Paste_Image.png

相關(guān)代碼如下:

  • APP端打開微信微信支付代碼
#pragma mark -  微信支付
- (void)wechatPay:(WechatOrderModel *)model
{

    //調(diào)起微信支付 model 為自己服務(wù)器返回的參數(shù)
    PayReq *req = [[PayReq alloc] init];
    req.partnerId = model.partnerid;
    req.prepayId = model.prepayid;
    req.nonceStr = model.noncestr;
    req.timeStamp = model.timestamp.intValue;
    req.package = model.package;
    req.sign = model.sign;//sign 為自己服務(wù)器獲取到預(yù)支付訂單號prepayId后送浊,重新生成的簽名袄友,當(dāng)然本地也可以生成簽名漾唉,簽名代碼如下
    [WXApi sendReq:req];
    
    //日志輸出
    NSLog(@"微信支付請求參數(shù) =====  appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",model.appid,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign);
}
  • APP端重新生成簽名(建議放在服務(wù)端處理)

#pragma mark -  微信支付本地簽名
//創(chuàng)建發(fā)起支付時(shí)的sign簽名
-(NSString *)createMD5SingForPayWithAppID:(NSString *)appid_key partnerid:(NSString *)partnerid_key prepayid:(NSString *)prepayid_key package:(NSString *)package_key noncestr:(NSString *)noncestr_key timestamp:(UInt32)timestamp_key{
    NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
    [signParams setObject:appid_key forKey:@"appid"];//微信appid 例如wxfb132134e5342
    [signParams setObject:noncestr_key forKey:@"noncestr"];//隨機(jī)字符串
    [signParams setObject:package_key forKey:@"package"];//擴(kuò)展字段  參數(shù)為 Sign=WXPay
    [signParams setObject:partnerid_key forKey:@"partnerid"];//商戶賬號
    [signParams setObject:prepayid_key forKey:@"prepayid"];//此處為統(tǒng)一下單接口返回的預(yù)支付訂單號
    [signParams setObject:[NSString stringWithFormat:@"%u",timestamp_key] forKey:@"timestamp"];//時(shí)間戳
    
    NSMutableString *contentString  =[NSMutableString string];
    NSArray *keys = [signParams allKeys];
    //按字母順序排序
    NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        return [obj1 compare:obj2 options:NSNumericSearch];
    }];
    //拼接字符串
    for (NSString *categoryId in sortedArray) {
        if (   ![[signParams objectForKey:categoryId] isEqualToString:@""]
            && ![[signParams objectForKey:categoryId] isEqualToString:@"sign"]
            && ![[signParams objectForKey:categoryId] isEqualToString:@"key"]
            )
        {
            [contentString appendFormat:@"%@=%@&", categoryId, [signParams objectForKey:categoryId]];
        }
    }
    //添加商戶密鑰key字段  API 密鑰
    [contentString appendFormat:@"key=%@", @"商戶密鑰"];
    NSString *result = [contentString md5String];//md5加密
    return result;
}
  • MD5 加密方法

/**
 *  MD5 加密
 *
 *  @return 加密后字符串
 */
- (NSString *)md5String
{
    if(self == nil || [self length] == 0) return nil;
    unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
    CC_MD5([self UTF8String], (int)[self lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
    NSMutableString *ms = [NSMutableString string];
    for(i=0;i<CC_MD5_DIGEST_LENGTH;i++)
    {
        [ms appendFormat: @"%02x", (int)(digest[i])];
    }
    return [ms copy];
}

至此微信集成結(jié)束故俐,坑的地方就是 app端調(diào)用微信支付時(shí)的簽名參數(shù)sign一定要重新生成单山,不要使用統(tǒng)一下單接口返回的sign,切記?醚贰P咏凇0桥兵睛!

記錄點(diǎn)滴肯骇,與君共勉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末祖很,一起剝皮案震驚了整個(gè)濱河市笛丙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌假颇,老刑警劉巖胚鸯,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異笨鸡,居然都是意外死亡姜钳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門形耗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哥桥,“玉大人,你說我怎么就攤上這事激涤∧飧猓” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵倦踢,是天一觀的道長送滞。 經(jīng)常有香客問我,道長辱挥,這世上最難降的妖魔是什么犁嗅? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮晤碘,結(jié)果婚禮上褂微,老公的妹妹穿的比我還像新娘。我一直安慰自己哼蛆,他們只是感情好蕊梧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著腮介,像睡著了一般肥矢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天甘改,我揣著相機(jī)與錄音旅东,去河邊找鬼。 笑死十艾,一個(gè)胖子當(dāng)著我的面吹牛抵代,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播忘嫉,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼荤牍,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庆冕?” 一聲冷哼從身側(cè)響起康吵,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎访递,沒想到半個(gè)月后晦嵌,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拷姿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年惭载,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片响巢。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡描滔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵乓,到底是詐尸還是另有隱情伴挚,我是刑警寧澤,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布灾炭,位于F島的核電站茎芋,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蜈出。R本人自食惡果不足惜田弥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铡原。 院中可真熱鬧偷厦,春花似錦、人聲如沸燕刻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卵洗。三九已至请唱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背十绑。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工聚至, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人本橙。 一個(gè)月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓扳躬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親甚亭。 傳聞我的和親對象是個(gè)殘疾皇子贷币,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 引言 秋高氣爽片择,天氣轉(zhuǎn)涼,正是學(xué)習(xí)工作做的好時(shí)候骚揍。(~ ̄▽ ̄)~~(~ ̄▽ ̄)~ 我是個(gè)phper最近在寫微信支付...
    恩就是這個(gè)名閱讀 7,974評論 2 15
  • 一、背景介紹 作為一名Android開發(fā)啰挪,從最初的跌跌撞撞到現(xiàn)在小有所悟信不,這其中經(jīng)歷過的辛酸苦辣也是一種痛并快樂著...
    freecats08閱讀 4,849評論 7 54
  • 自己總結(jié)的微信支付寶支付流程和注意點(diǎn): 準(zhǔn)備工作: 需要公司的營業(yè)執(zhí)照,稅務(wù)信息亡呵,等老板的身份證信息等抽活,我記得,用...
    Www劉閱讀 18,569評論 2 50
  • 銀聯(lián)支付梭姓,支付寶支付,微信支付的三大總結(jié)嫩码,之前也有寫過兩篇誉尖。 微信支付,支付寶支付铸题,銀聯(lián)支付——三大支付總結(jié): h...
    LucasAdam閱讀 4,945評論 2 23
  • 1.確定報(bào)名的主題铡恕,時(shí)間 2.信息收集,在5月28號周日晚上6點(diǎn)前完成 朱宇盛 劉明成 任已佳 李魚 韓曜澤 孔智...
    簡兮兮兮閱讀 267評論 0 0