微信支付集成步驟

1,申請微信支付的功能,獲取到開發須要的參數

 

2,iOS端集成微信支付

2.1項目設置APPID

在URL Scheme中設置php

2.2 導入sdk,配置項目,註冊APPID

2.2.1 導入demo中的sdk,

2.2.2 還須要倒入demo中的幾個系統庫

   SystemConfiguration.frameworkios

    Security.framework算法

    CoreTelephony.frameworksql

    Foundation.frameworkjson

    UIKit.frameworkapi

    libsqlite3.0.tbd服務器

    libz.tbd微信

2.2.3 調用API前,須要先向微信註冊您的APPID,代碼以下:

[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];app

2.2.4 設置白名單

wechat,wexinide

 

2.3 調起支付

從服務端獲取支付須要的參數

PayReq *request = [[[PayReq alloc] init] autorelease];

request.partnerId = @"10000100";

request.prepayId= @"1101000000140415649af9fc314aa427";

request.package = @"Sign=WXPay";

request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";

request.timeStamp= @"1397527777";

request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";

[WXApi sendReq:request];

 

2.4 支付結果回調處理

-(void)onResp:(BaseResp*)resp{
			  if ([respisKindOfClass:[PayRespclass]]){
			      PayResp*response=(PayResp*)resp;
			      switch(response.errCode){
			          caseWXSuccess:
                      			//服務器端查詢支付通知或查詢API返回的結果再提示成功
                      			NSlog(@"支付成功");
                      	break;
                      	default:
                      	NSlog(@"支付失敗,retcode=%d",resp.errCode);
                      	break;
                  }
                  	}
                }

 

3 測試和dubug

用微信官方提供的http get接口進行測試

@"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios"

返回的數據格式以下

{
    "appid":"wxb4ba3c02aa476ea1",
    "partnerid":"1305176001",
    "package":"Sign=WXPay",
    "noncestr":"60adcb1dcd5d0e8fe903822313810988",
    "timestamp":1473724660,
    "prepayid":"wx20160913075740396ab1584b0080984714",
    "sign":"483F092E7384602E8E7F7ABA3E9F9FC1"
}

- (IBAction)payWXWithMonicSever:(UIButton *)sender {
    
    //============================================================
    // V3&V4支付流程實現
    // 注意:參數配置請查看服務器端Demo
    // 更新時間:2015年11月20日
    //============================================================
    NSString *urlString   = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";
    //解析服務端返回json數據
    NSError *error;
    //加載一個NSURL對象
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    //將請求的url數據放到NSData對象中
    NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    if ( response != nil) {
        NSMutableDictionary *dict = NULL;
        //IOS5自帶解析類NSJSONSerialization從response中解析出數據放到字典中
        dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
        
        NSLog(@"url:%@",urlString);
        if(dict != nil){
            NSMutableString *retcode = [dict objectForKey:@"retcode"];
            if (retcode.intValue == 0){
                NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
                
                //調起微信支付
                PayReq* req             = [[PayReq alloc] init];
                req.partnerId           = [dict objectForKey:@"partnerid"];
                req.prepayId            = [dict objectForKey:@"prepayid"];
                req.nonceStr            = [dict objectForKey:@"noncestr"];
                req.timeStamp           = stamp.intValue;
                req.package             = [dict objectForKey:@"package"];
                req.sign                = [dict objectForKey:@"sign"];
                [WXApi sendReq:req];
                //日誌輸出
                NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
                return  ;
            }else{
                NSLog(@"%@",[dict objectForKey:@"retmsg"]);
                return ;
            }
        }else{
            NSLog(@"%@",@"服務器返回錯誤,未獲取到json對象");
            return ;
        }
    }else{
        NSLog(@"%@",@"服務器返回錯誤");
        return ;
    }
    
    
}

 

預支付訂單接口通常由服務器調用,app本地測試時也能夠使用

 

驗證簽名是否正確

驗證簽名是否正確能夠用微信提供的這個網頁,若是本地的簽名結果和網頁上一致那就完成了。

 http://mch.weixin.qq.com/wiki/tools/signverify/

 

ios本地調試

本地調試能夠使用微信sdk中的payRequsestHandler 類進行,下面的步驟通常不須要進行。協助後臺開發調試纔會使用。至關於從生成預支付訂單到調起微信支付sdk的步驟所有在客戶端完成。

//建立支付簽名對象
    payRequsestHandler *reqHandler = [payRequsestHandler alloc];
    //初始化支付簽名對象
    [reqHandler init:WX_APP_ID mch_id:WX_MCHID];
    //設置密鑰
    [reqHandler setKey:WX_PARTNER_ID];
    
    
    //價格*100
    NSString *priceString=@"1";
    NSString *orderName=@"測試標題";
    
    NSString *identifierForVendor = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
    
    
    
    //獲取到實際調起微信支付的參數後,在app端調起支付
    NSMutableDictionary *dict = [reqHandler getPrepayWithOrderName:orderName price:priceString device:identifierForVendor];
    
    NSLog(@"dict%@",dict);
    //在payRequestHandle.mm文件裏調用該方法
    
    if(dict == nil){
        //錯誤提示
        NSString *debug = [reqHandler getDebugifo];
        
        NSLog(@"debug %@",debug);
        
        NSLog(@"%@\n\n",debug);
    }else{
        NSLog(@"%@\n\n",[reqHandler getDebugifo]);
        //[self alert:@"確認" msg:@"下單成功,點擊OK後調起支付!"];
        
        NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
        
        //調起微信支付
        PayReq* req             = [[PayReq alloc] init];
        req.openID              = [dict objectForKey:@"appid"];
        req.partnerId           = [dict objectForKey:@"partnerid"];
        req.prepayId            = [dict objectForKey:@"prepayid"];
        req.nonceStr            = [dict objectForKey:@"noncestr"];
        req.timeStamp           = stamp.intValue;
        req.package             = [dict objectForKey:@"package"];
        req.sign                = [dict objectForKey:@"sign"];
        
        [WXApi sendReq:req];
        NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
        
        
        
    }

 

常見問題

通常發現問題就是支付失敗,能夠逐步檢查

1,是否獲取到預支付id,

若是獲取成功說明微信支付參數配置正確,第一步簽名算法正確,獲取失敗則檢查這些內容

2,是否付款成功

失敗,檢查第二步簽名和調起微信sdk的參數

 

微信支付的金額是以分爲單位,支付0.01 元須要在訂單中傳遞price 爲1。 

 

參考資料

業務介紹

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

 

詳細開發步驟

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

 

微信支付SDK和demo下載地址

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

 

預支付接口文檔

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

 

http://www.jianshu.com/p/94dcc220b2aa

相關文章
相關標籤/搜索