微信支付小講解

jopen 9年前發布 | 33K 次閱讀 微信

微信支付

移動支付盛行,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,刪掉友盟里重復即可,這里網上有相關資料,不再贅述

項目主頁:http://www.baiduhome.net/lib/view/home/1440420419154

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!