天天看點

iOS 內建微信支付

主要寫下關鍵

發起支付

- (NSString *)jumpToBizPayWithDic:(NSDictionary *)dict {
    
    
    if (![WXApi isWXAppInstalled]) {
        return @"該裝置沒有安裝微信";
    }
    if (![WXApi isWXAppSupportApi]) {
        return @"該裝置不支援微信";
    }

        if(dict != nil){
            
            NSString *orderId = [dict objectForKey:@"ordersn"];
            UInt32 timeStamp = [self stamp];
            NSString *nonceStr =  [dict objectForKey:@"nonceStr"];
            NSString *package = @"Sign=WXPay";
            
            NSString *md5sign = [self signWithappid:wx_appid
                                        andnoncestr:nonceStr
                                         andpackage:package
                                       andpartnerid:PARTNER_Id
                                        andprepayid:orderId
                                       andtimestamp:timeStamp
                                             andkey:PARTNER_Id_key];
        
                //調起微信支付 主要參數:
                PayReq* req             = [[PayReq alloc] init];
                req.partnerId           = PARTNER_Id;                     // 商戶id 這個是固定的,必須wx124
                req.prepayId            = orderId;                        // 訂單号 這個是背景傳回的(是預付訂單号)
                req.nonceStr            = nonceStr;                     // 随機數 (需要背景傳回,不能自己生産,因為要保持一緻)
                req.timeStamp           = timeStamp;                   // 時間戳 (可以自己生成,也可以背景傳回)
                req.package             = package;                  // 擴充字段 (微信要求暫時傳@"Sign=WXPay")
                req.sign                = md5sign; // 這個簽名最關鍵,也最容易出錯,基本都被坑在這裡(自己生成的,生成方法下面有)
            
              BOOL flag = [WXApi sendReq:req]; 

                return @"";
            
        }else{
            return @"伺服器傳回錯誤,未擷取到json對象";
        }
}
           

簽名生成方法(方法名沒有大寫,因為微信參數拼接的時候,參數名要求全小寫,怕出錯,是以全部是是複制進去的……)

//最坑的地方,需要仔仔細細的看文檔,參數有順序,是以我把順序已經寫死了。key必須放在最後。需要把7個參數拼接一起,然後md5編碼(注意還是大寫)。
- (NSString *)signWithappid:(NSString *)appid
                andnoncestr:(NSString *)noncestr
                 andpackage:(NSString *)package
               andpartnerid:(NSString *)partnerid
                andprepayid:(NSString *)prepayid
               andtimestamp:(UInt32)timestamp
                     andkey:(NSString *)key{
    NSString *string = [NSString stringWithFormat:@"appid=%@&noncestr=%@&package=%@&partnerid=%@&prepayid=%@×tamp=%@&key=%@",appid,noncestr,package,partnerid,prepayid,[NSString stringWithFormat:@"%u",timestamp],key];
    NSString * md5str = [self md5: string];
    NSString *us = md5str.uppercaseString;
    return us;
}
           

md5編碼方式:

- (NSString *)md5:(NSString *)str
{
    const char *cStr = [str UTF8String];
    unsigned char result[];
    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
    return [NSString stringWithFormat:
            @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
            result[0], result[1], result[2], result[3],
            result[4], result[5], result[6], result[7],
            result[8], result[9], result[10], result[11],
            result[12], result[13], result[14], result[15]
            ];
    
}

           

最後附一個簽名檢查工具,官方的 https://pay.weixin.qq.com/wiki/tools/signverify/

其實我是遇到另外一個更坑的東西。 appid和商戶的key是boss直接給我的,安卓那邊已經實作了支付,是以認為這兩個參數是沒問題的 當我被"商戶下單id非法"這個問題坑了很久很久之後登陸開放平台,發現建立應用的時候沒有勾選iOS……