微信支付小講解
微信支付
移動支付盛行,app接入逐漸成為標配
今天和大家分享一下微信支付的接入
調起微信支付的整個流程是:
一、在appDelegate中配置,并寫好方法接受微信返回信息,
二、調用后臺接口(自定義)與微信交互,微信返回必要參數,其中最主要一個參數是prepay_id
三、使用appid、noncestr(下面有詳細生成方法)package(目前為固定值,直接給@"Sign=WXPay")、partnerid(就是mchId)timestamp(時間戳)、prepayid生成簽名sign
四、將必要參數傳給PayReq對象
五、最后,使用WXApi的sendReq方法吊起微信。
下面開始貼方法:
準備工作:
1.到微信開放平臺,申請開通支付功能(唯一注意,bundleId需與工程一致),在財付通回饋的郵箱中獲取以下信息(注:以下信息已修改,不可直接復制使用)
APP_ID @"wxf120b5260432545" //APPID APP_SECRET @"998d17563f0d6d0181b90ff543656ygrs" //appsecret MCH_ID @"1269999401" //商戶號 PARTNER_ID @"xbM5MBCVOj2sEAs8KrMfwla4djpcQKuvG9" //商戶API密鑰
2.下載微信支付SDK
3.AppDelegate 可直接復制使用
#import "WXApi.h" #import "WXApiObject.h" - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1.注冊微信 [WXApi registerApp:WECHAT_APPID withDescription:@"weichatpayblog"]; return YES; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WXApi handleOpenURL:url delegate:self]; } - (void)onResp:(BaseResp *)resp { NSString *strMsg = [NSString stringWithFormat:@"errcode:%d",resp.errCode]; NSString *strTitle; NSString *strNote; if ([resp isKindOfClass:[PayResp class]]) { // 支付返回結果,實際支付結果需要去微信服務器端查詢 strTitle = @"支付結果"; } switch (resp.errCode) { case WXSuccess:{ strMsg = @"支付成功,可以進行洗車"; strNote = @"success"; break; } case WXErrCodeUserCancel:{ strMsg = @"支付已取消"; strNote = @"cancel"; break; } case WXErrCodeSentFail: { strMsg = @"支付失敗,請重新支付"; strNote = @"fail"; break; } default:{ strMsg = @"支付失敗"; strNote = @"fail"; break; } } [[NSNotificationCenter defaultCenter] postNotificationName:ORDER_PAY_NOTIFICATION object:strNote]; [Alert showWithTitle:strMsg]; } - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WXApi handleOpenURL:url delegate:self]; }
4.調起支付
#import "WXApi.h" #import "WXApiObject" #import "WXUtil.h" - (void)clickPayWithWechat { // 判斷客戶端是否安裝微信/版本是否支持 if ([self isWXAppInstalled]) { [self updateOrderInfoToWechat]; } } - (BOOL)isWXAppInstalled { // 1.判斷是否安裝微信 if (![WXApi isWXAppInstalled]) { [Alert showWithTitle:@"您尚未安裝\"微信App\",請先安裝后再返回支付"]; return NO; } // 2.判斷微信的版本是否支持最新Api if (![WXApi isWXAppSupportApi]) { [Alert showWithTitle:@"您微信當前版本不支持此功能,請先升級微信應用"]; return NO; } return YES; } - (void)updateOrderInfoToWechat { // 調用自己后臺接口 // 返回 prePay_id // wechatModel 為自定義模型 存儲微信支付所需參數 if (wechatModel.prepay_id != nil) { DLog(@" %@ ",wechatModel.prepay_id); NSString *package, *time_stamp, *nonce_str; time_t now; time(&now); time_stamp = [NSString stringWithFormat:@"%ld",now]; nonce_str = [WXUtil md5:time_stamp]; package = @"Sign=WXPay"; NSMutableDictionary *signParams = [NSMutableDictionary dictionary]; [signParams setObject:WECHAT_APPID forKey:@"appid"]; [signParams setObject:nonce_str forKey:@"noncestr"]; [signParams setObject:package forKey:@"package"]; [signParams setObject:WECHAT_MCH_ID forKey:@"partnerid"]; [signParams setObject:time_stamp forKey:@"timestamp"]; [signParams setObject:wechatModel.prepay_id forKey:@"prepayid"]; NSString *sign = [self createMd5Sign:signParams]; [signParams setObject:sign forKey:@"sign"]; // 這里 調起微信 一個參數也不能少 重要的事 我不想說三遍了,調不起會來看三遍的 哈哈哈.... PayReq *req = [[PayReq alloc] init]; req.openID = WECHAT_APPID; req.partnerId = WECHAT_MCH_ID; req.prepayId = wechatModel.prepay_id; req.nonceStr = nonce_str; req.timeStamp = time_stamp.intValue; req.package = package; req.sign = sign; [WXApi sendReq:req]; } } -(NSString*) createMd5Sign:(NSMutableDictionary*)dict { NSMutableString *contentString =[NSMutableString string]; NSArray *keys = [dict allKeys]; //按字母順序排序 NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2 options:NSNumericSearch]; }]; //拼接字符串 for (NSString *categoryId in sortedArray) { if (![[dict objectForKey:categoryId] isEqualToString:@""] && ![categoryId isEqualToString:@"sign"] && ![categoryId isEqualToString:@"key"]) { [contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]]; } } //添加key字段 [contentString appendFormat:@"key=%@", wechatModel.key]; //得到MD5 sign簽名 NSString *md5Sign =[WXUtil md5:contentString]; // //輸出Debug Info // [debugInfo appendFormat:@"MD5簽名字符串:\n%@\n\n",contentString]; return md5Sign; }
至此 應該已經成功調起微信支付了,在這個類當中,添加觀察者,對跳轉后的信息處理
將狀態信息傳給自己的后臺 就結束了
過程中需要注意的是
1.傳個PayReq對象的參數不能少
2.如果工程中使用了友盟,會出現沖突,因為友盟的包里包含了微信sdk,刪掉友盟里重復即可,這里網上有相關資料,不再贅述
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!