Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 微信支付,支付寶支付的集成和注意部分

微信支付,支付寶支付的集成和注意部分

編輯:關於Android編程

一.支付寶支付

1. 集成說明

1.1 作為當下最熱門的支付寶和微信支付,相信有很多的app都很樂意的將支付寶集成在app中,畢竟只要你開發的app有一點涉及到買賣的,都需要集成支付寶或者微信支付.那麼接下來我將為大家一一列舉舉出我在集成支付寶和微信中遇到的難點和其中出現的一些坑.

2. 集成前的准備(裡面的步驟在集成文檔中都有介紹)

2.1 注冊支付寶帳號(賬戶最好采用公司郵箱注冊)——附上網址

https://www.baidu.com/s?wd=%E6%94%AF%E4%BB%98%E5%AE%9D%E5%BC%80%E5%8F%91%E8%80%85%E5%B9%B3%E5%8F%B0&rsv_spt=1&rsv_iqid=0xfe0a29290002df6b&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=monline_3_dg&rsv_enter=1&rsv_sug3=14&rsv_sug1=10&rsv_sug7=100&rsv_sug2=0&prefixsug=%E6%94%AF%E4%BB%98%E5%AE%9D%E9%9B%86%E6%88%90&rsp=4&inputT=9885&rsv_sug4=10467

2.2 設置(申請)支付密碼

2.3 設置密碼提示問題

2.4 綁定手機

2.5 創建應用(目的 : 獲取APPID帳號)

2.6 然後就等待支付寶那邊審核通過了

3. 開始集成

3.1 打開集成文檔

https://doc.open.alipay.com/

3.2 按步驟執行

3.2.1 點擊文檔中的 支付能力—->App支付—->SDK下載(https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1)—->SDK&DEMO(將demo和sdk下載下來)
3.2.2 運行支付寶支付Demo,了解支付寶整個支付的流程(如果裡面出現錯誤,直接百度或者查看文檔,裡面有詳細的解釋,我這裡就不再一一說明了)

4. 系統交互流程(紅色部分是重點部分)

這裡寫圖片描述

4.1 流程 : 商戶客戶端發送請求(獲取簽名後的訂單信息)—->商戶服務端(返回簽名後的訂單信息sign)—->調用支付寶支付接口,發送支付請求—->返回支付結果

5. 訂單 : 由服務器生成

6. 注意 : 只需得到服務器返回的sign

7. 導入相關文件(此處導入文件最好看官方文檔,比較正式)

這裡寫圖片描述

8. 導入相關庫

8.1 TARGETS—->General—->Linked Frameworks and Libraries—->點擊”+”導入相關的庫(此處導入的文件當已開發文檔中規定的為主)

8.2 填寫支付寶URL Schemes : TARGETS—-> info—-> URL Types(5)—-> 點擊”+”對支付寶的添加(此處當已開發文檔中規定的為主)—-> 結果圖如下

這裡寫圖片描述

9. 說明

9.1 支付寶的集成本來是和Demo上代碼書寫的順序一樣,但是由於我們後台是第一次做支付,所以最終無法返回一個正確的sign,這樣導致我們集成的時候中間有一個步驟是多余的.

10. 集成

10.1 發送請求給後台,請求需要的字串(由於我們做的app設計到需要傳入10個參數給後台,才能返回結果)—-> 下面貼上請求代碼

    long activityId = _activitiy.ActivityId;
        NSString *stringActivityId = [@(activityId) stringValue];         //活動ID
        NSString *userId = [AppConfig shareInstance].UserID;
        //用戶ID
        [self.paramDic setObject:stringActivityId forKey:@"activityId"];
        [self.paramDic setObject:userId forKey:@"userId"];
    NSString *bodyStr = _activitiy.title;
    NSString *subjectStr = _activitiy.title;
    NSInteger total_amount = _activitiy.totalFee;
    NSDateFormatter* formatter = [NSDateFormatter new];
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    NSDictionary *lastDic = @{
                              @"body":bodyStr,
                              @"subject":subjectStr,
                              @"total_amount":[NSString stringWithFormat:@"%.2ld",(long)total_amount],
                              @"spbillCreateip":[self deviceIPAdress]
                              };
    NSMutableDictionary *bigDic = [lastDic mutableCopy];
    [bigDic addEntriesFromDictionary:dic];

10.2 發送請求(裡面包含了調用支付寶的接口)

[[[SpeedService alloc]init]FetchUserPayProduct:nil paramDic:bigDic completionBlock:^(id response, NSError *error) {
        NSLog(@"++++%@",response);
        //服務器返回的訂單信息

        NSDictionary *samllDic = [response objectForKey:@"result"];

        //服務器返回的簽名
        NSString *sign = [samllDic objectForKey:@"sign"];
        //簽名Encode編碼
        NSString *locationSignEncode = [self encodeValue:sign];
        //創建訂單模型對象並且賦值
        Order *order = [Order new];

        order.biz_content = [BizContent new];

        order.app_id             = [samllDic objectForKey:@"app_id"];
        order.biz_content        = [samllDic objectForKey:@"biz_content"];

        order.charset            = [samllDic objectForKey:@"charset"];
        order.method             = [samllDic objectForKey:@"method"];
        order.notify_url         = [samllDic objectForKey:@"notify_url"];
        order.sign_type          = [samllDic objectForKey:@"sign_type"];
        order.timestamp          = [samllDic objectForKey:@"timestamp"];
        order.version            = [samllDic objectForKey:@"version"];

        //訂單信息Encode編碼
        NSString *messageEncode = [order orderInfoEncoded:YES];

        //最終訂單信息字符串Encode編碼
        NSString *orderOneString = [NSString stringWithFormat:@"%@&sign=%@",
                                    messageEncode, locationSignEncode];

        [[AlipaySDK defaultService] payOrder:orderOneString fromScheme:Scheme callback:^(NSDictionary *resultDic) {
            NSLog(@"服務器返回的結果:%@",resultDic);
        }];
    }];

10.3 簽名Encode編碼

- (NSString*)encodeValue:(NSString*)value
{
    NSString* encodedValue = value;
    if (value.length > 0) {
        encodedValue = (__bridge_transfer  NSString*)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)value, NULL, (__bridge CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
    }
    return encodedValue;
}

10.4 注意

1. 訂單信息Encode編碼就不需要自己手動編碼了,直接調用支付寶提供的接口,接口裡面已經對排序,編碼進行了設置,直接調用就行
2. 裡面的集成步驟和Demo中的有所不同,你們也可以根據自己的需求,酌情的增加或者減少.

11. 支付寶如果按照上面的步驟集成,應該是沒問題的,文章結尾後會貼上我集成的時候遇見的bug和坑,敬請期待(支付寶集成完畢)

二 . 微信支付

1. 集成說明 : 相對於支付寶集成,微信集成要簡單的多了

2. 集成前的准備(完成一下需要的帳號信息)

2.1 微信帳號

2.2 微信帳號密碼

2.3 微信支付商戶號

2.4 商戶平台登錄帳號

2.5 商戶平台登錄密碼

2.6 應用APPID

3. 注意 : 以上步驟在微信支付平台上都有說明,我這裡就不一一介紹了

4. 微信開放平台(附上網址:只要注冊過了,就可以直接登錄查看相關信息)—>選擇

[微信支付]APP支付開發者文檔

https://www.baidu.com/s?wd=%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98%E5%B9%B3%E5%8F%B0&rsv_spt=1&rsv_iqid=0x970a0db100003d17&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=monline_3_dg&rsv_enter=1&rsv_sug3=12&rsv_sug1=9&rsv_sug7=100&rsv_sug2=0&prefixsug=%E5%BE%AE%E4%BF%A1%E6%94%AF%E4%BB%98&rsp=8&inputT=7099&rsv_sug4=7846

5. 下載微信支付sdk

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

這裡寫圖片描述

6. 運行Demo(如果出現錯誤,直接照著官方文檔修改或者百度就行—>通常下載微信支付sdk運行是不存在問題的)

7. 交互時序圖(紅色框是重點部分)

這裡寫圖片描述

8. 總結 : 我們只需要給後台請求,返回需要的7個參數就可以了

9. 導入相關文件(注意 : 以微信支付開發文檔為准)

這裡寫圖片描述

10. 添加 URL Types(5)微信—-> 如果在集成微信支付之前使用了微信分享,那該步驟可以省略

TARGETS—->info—->URL Types(5)—->點擊”+”添加微信URL Schemes(如下圖)

這裡寫圖片描述

11. 向微信注冊AppID(代碼如下)—-> 第一個空 : AppID(最好使用宏) 第二個空 : 可以隨便填寫

11.1 注意 : 如果在集成微信支付之前集成了微信分享,那麼該句代碼必須寫在分享注冊的代碼之後

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [WXApi registerApp:WXapp_id withDescription:@"測試demo"];
}

12. 集成代碼一(給服務器發送請求—->得到需要的7個參數openID,partnerId,prepayId,nonceStr,timeStamp,package,sign)

#pragma mark - 微信支付
- (void)setUpWxPay
{
    long activityId = _activitiy.ActivityId;
    NSString *stringActivityId = [@(activityId) stringValue];
    NSString *userId = [AppConfig shareInstance].UserID;
    NSString *userTel = [self.paramDic objectForKey:@"mobile"];
    if (userTel.length == 0 || userTel.length > 11) {
        [SVProgressHUD showErrorWithStatus:@"請輸入正確的聯系電話"];
        return;
    }
    NSString *userName = [self.paramDic objectForKey:@"name"];
    if (userName.length == 0) {
        [SVProgressHUD showErrorWithStatus:@"請輸入姓名"];
        return;
    }
    NSString *userIdentity = [self.paramDic objectForKey:@"identity"];
    BOOL identity = [self isCorrect:userIdentity];
    NSString *userEmail = [self.paramDic objectForKey:@"email"];
    if (userEmail.length == 0) {
        [SVProgressHUD showErrorWithStatus:@"請輸入郵箱號"];
        return;
    }
    NSInteger totalFee = _activitiy.totalFee;
    NSString *body = _activitiy.title;
    NSString *subject = _activitiy.title;
    NSString *spbillCreateip = [self deviceIPAdress];
    SpeedService *speedService = [[SpeedService alloc] init];
    NSDictionary *dict = @{
                           @"body":body,
                           @"subject":subject,
                           @"userId":userId,
                           @"activityId":stringActivityId,
                           @"name":userName,
                           @"email":userEmail,
                           @"mobile":userTel,
                           @"identity":userIdentity,
                           @"total_amount":[NSString stringWithFormat:@"%d",totalFee],
                           @"spbillCreateip":spbillCreateip
                           };
    NSLog(@"字典是 : %@",dict);
    if (identity == YES) {
        //判斷是否安裝了微信
        if ([WXApi isWXAppInstalled]){
            [speedService FetchUserWxPayProduct:dict completionBlock:^(id response, NSError *error) {
                if (!error) {
                    NSLog(@"返回的結果是 : %@",response);
                    NSString * str = [response objectForKey:@"code"];
                     if ([str isEqualToString:@"0000"]) {
                        NSDictionary *dic = [NSDictionary dictionaryWithDictionary:[response objectForKey:@"result"]];
                        [self configRequest:dic stringStr:nil];
                     }

                }else{

                    NSLog(@"網絡超時,返回的錯誤信息是 : %@",error);
                }
            }];

        }else{

            [SVProgressHUD showErrorWithStatus:@"請安裝微信"];
        }

    }else{
        [SVProgressHUD showErrorWithStatus:@"請輸入正確的身份證號碼"];
        return;
    }
}

13. 調用微信支付代碼,即可完成微信支付

#pragma mark - 調用微信支付的接口
- (void)configRequest:(NSDictionary *)dic stringStr:(NSString *)stringStr{

    //需要創建這個支付對象
    PayReq *req = [[PayReq alloc] init];

    //由用戶微信號和AppID組成的唯一標識,用於校驗微信用戶
    req.openID = [dic objectForKey:@"appid"];

    // 商家id,在注冊的時候給的
    req.partnerId = [dic objectForKey:@"partnerid"];

    // 預支付訂單這個是後台跟微信服務器交互後,微信服務器傳給你們服務器的,你們服務器再傳給你
    req.prepayId  = [dic objectForKey:@"prepayid"];

    // 隨機編碼,為了防止重復的,在後台生成
    req.nonceStr  = [dic objectForKey:@"noncestr"];

    // 這個是時間戳,也是在後台生成的,為了驗證支付的
    NSMutableString *stamp = [dic objectForKey:@"timestamp"];
    req.timeStamp = stamp.intValue;

    // 根據財付通文檔填寫的數據和簽名
    //這個比較特殊,是固定的,只能是即req.package = Sign=WXPay
    req.package = [dic objectForKey:@"package"];

    // 這個簽名也是後台做的
    req.sign = [dic objectForKey:@"sign"];

    //發送請求到微信,等待微信返回onResp
    [WXApi sendReq:req];
}

14. 特別說明 : 由於調用微信支付的7個參數都是服務器返回來的,不需要客戶端做任何事情.當然有些參數客戶端也是可以自己生成的,這就留給你們自己去處理了.

三. 總結

1. 集成支付寶出現的錯誤 :

1.1 能拿到服務器那邊的sign,但是在調用支付寶接口的時候,代碼運行並不會執行支付寶接口的block塊,並且打印信息直接是提示今天已經注冊報道了.

—-> 1.1.1 解決辦法:將info–URL Types(5)–URL Schemes中配置的長度該為高於6個字串,很有可能是因為重名的問題.(直接重命名就行)

1.2 支付寶注冊時間問題 : 在8月9號之前注冊的用戶,使用支付寶2.0的版本會出現問題,但是可以使用支付寶1.0版本的(重申:如果解簽再重新簽約的話,就可以使用支付寶2.0,並且兼容支付寶1.0的sdk)

—-> 1.2.1 解決辦法 : 解簽,再重新簽約大約花1個工作日的時間

1.3 集成支付寶的時候,給自己的服務器發送請求得到sign.當打印請求拼接的參數的時候,經過仔細對比,發現其中會出現key和value值順序顛倒問題

—-> 1.3.1 解決辦法:將原來導入的sdk刪除,重新倒入一次sdk就可以解決問題(很有可能是sdk造成的問題,我重新導入就解決了這問題)

1.4 簽名(sign)出現的問題: 運用服務器返回的sign拼接成字符串,真機上出現系統繁忙,請重試.

—-> 1.4.1 解決方案 : 經過和支付寶提供的demo對比,支付寶的demo是完全可以實現支付功能,但是字符串加上後台返回的sign就出現這樣的錯誤提示,說明簽名有問題,這時只能叫後台返回正確的簽名.

1.5 順序問題 :如果服務器返回的sign沒問題,那麼最終就是的發送給支付寶參數拼接順序問題了,要嚴格按照服務器返回的字串順序拼接,然後再請求支付寶接口.(最後的出的結論是,不需要程序員手動按照順序拼接,直接調用支付寶提供的方法,就可以完成拼接).

2. 微信支付出現的錯誤 :

1.1 集成完微信支付之後,真機運行,微信支付的時候只出現一個白的確定按鈕,點擊的時候跳回原來的app,並且返回-2

這裡寫圖片描述

—-> 1.1.1 解決辦法 : 肯定是參數的問題,如果你能確定你這裡沒錯,那麼就是後台返回的參數有問題(我做的時候是後台將一個參數的小寫寫成了大寫,所以出現了這樣的問題.其它錯誤是不會造成這樣的結果的.仔細檢查參數就可以解決)

四. 寫在最後

這段時間由於很忙,拖欠了很多博客沒有更新,後續我一定會慢慢補上來.最後如果大家覺得我寫的還可以,麻煩關注我的官方博客,謝謝!!!!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved