第三方支付

一.微信支付流程
1.導(dǎo)入SDK


44.png

2.導(dǎo)入相關(guān)的系統(tǒng)庫及文件。不導(dǎo)入會報(bào)錯(cuò)目胡。
SystemConfiguration.framework
libz.tbd
libsqlite3.0.tbd
CoreTelephony.framework
libc++.tbd
3.配置info.plist
a.schemes 青扔,注意源织,item0 這里要修改成商戶自己的APPID


45.png

b.白名單
46.png

4.修改bitcode
47.jpeg

5.在AppDelegate 注冊微信
導(dǎo)入#import "WXApiManager.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //向微信注冊wxd930ea5d5a258f4f
    [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
    
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}

6.接下來,就是發(fā)起請求支付了微猖,實(shí)現(xiàn)上核心代碼只有幾行

                 //調(diào)起微信支付
                    PayReq* req             = [[[PayReq alloc] init]autorelease];
                    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];

7.不管支付成功還是失敗,我們直接處理回調(diào)結(jié)果即可

 switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付結(jié)果:成功谈息!";
                NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
                break;
                
            default:
                strMsg = [NSString stringWithFormat:@"支付結(jié)果:失斄莅侠仇!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                NSLog(@"錯(cuò)誤,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                break;
        }

客戶端進(jìn)行簽名

1.導(dǎo)入文件犁珠。


49.png

![Uploading 48_198784.png . . .]
2.里面有兩個(gè)文件是非arc的逻炊,我們需要設(shè)置一下 -fno-objc-arc


48.png

3.導(dǎo)入系統(tǒng)庫及info.list配置,請參數(shù)上面服務(wù)端簽名犁享。

4.AppDelegate配置
1)導(dǎo)入頭文件

#import "WXApi.h"
#import "payRequsestHandler.h"

2)實(shí)現(xiàn)微信代理

@interface AppDelegate ()<WXApiDelegate>
@end

3)注冊微信余素,及微信支付回調(diào)
復(fù)制代碼

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    //向微信注冊
    [WXApi registerApp:APP_ID withDescription:@"demo 2.0"];
    
    return YES;
}

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{
    return  [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    return  [WXApi handleOpenURL:url delegate:self];
}

// 微信支付成功或者失敗回調(diào)
-(void) onResp:(BaseResp*)resp
{
    NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
    NSString *strTitle;
    
    if([resp isKindOfClass:[SendMessageToWXResp class]])
    {
        strTitle = [NSString stringWithFormat:@"發(fā)送媒體消息結(jié)果"];
    }
    if([resp isKindOfClass:[PayResp class]]){
        //支付返回結(jié)果,實(shí)際支付結(jié)果需要去微信服務(wù)器端查詢
        strTitle = [NSString stringWithFormat:@"支付結(jié)果"];
        
        switch (resp.errCode) {
            case WXSuccess:
                strMsg = @"支付結(jié)果:成功炊昆!";
                NSLog(@"支付成功-PaySuccess桨吊,retcode = %d", resp.errCode);
                break;
                
            default:
                strMsg = [NSString stringWithFormat:@"支付結(jié)果:失敗凤巨!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
                NSLog(@"錯(cuò)誤视乐,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
                break;
        }
    }
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
}

5.寫方法直接在支付時(shí)調(diào)用
復(fù)制代碼

- (void)payForWechat
{
    //創(chuàng)建支付簽名對象
    payRequsestHandler *req = [[payRequsestHandler alloc] init];
    //初始化支付簽名對象
    [req init:APP_ID mch_id:MCH_ID];
    //設(shè)置密鑰
    [req setKey:PARTNER_ID];
    
    NSMutableDictionary *dict = [req sendPay_demo];
    
    if(dict != nil){
        NSMutableString *retcode = [dict objectForKey:@"retcode"];
        if (retcode.intValue == 0){
            NSMutableString *stamp  = [dict objectForKey:@"timestamp"];
            
            //調(diào)起微信支付
            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 );
        }else{
            [self alert:@"提示信息" msg:[dict objectForKey:@"retmsg"]];
        }
    }else{
        [self alert:@"提示信息" msg:@"服務(wù)器返回錯(cuò)誤,未獲取到j(luò)son對象"];
    }
}

//客戶端提示信息
- (void)alert:(NSString *)title msg:(NSString *)msg
{
    UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    
    [alter show];
}

二.支付寶支付流程
步驟1: 啟動(dòng)IDE(如Xcode),把iOS包中的壓縮文件中以下文件拷貝到項(xiàng)目文件夾下,并導(dǎo)入到項(xiàng)目工程中敢茁。

AlipaySDK.bundle                    
AlipaySDK.framework

步驟2: 在需要調(diào)用AlipaySDK的文件中,增加頭文件引用佑淀。

#import <AlipaySDK/AlipaySDK.h>

步驟3: 配置請求信息。

  Order *order = [[Order alloc] init];
   order.partner = partner;//合作身份者ID,以 2088 開頭由 16 位純數(shù)字組成的字符串卷要。請參考“7.1 如何獲得PID與 密鑰”渣聚。
           order.seller = seller;//支付寶收款賬號,手機(jī)號碼或郵箱格式。
private_key//商戶方的私鑰,pkcs8 格式
      order.tradeNO = [self generateTradeNO]; //訂單ID(由商家□自□行制定)
order.productName = product.subject; //商品標(biāo)題           order.productDescription = product.body; //商品描述

order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商 品價(jià)格

order.notifyURL = @"http://www.xxx.com"; //回調(diào)URL order.service = @"mobile.securitypay.pay"; order.paymentType = @"1";
order.inputCharset = @"utf-8";

order.itBPay = @"30m";
//應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL types NSString *appScheme = @"alisdkdemo";

//將商品信息拼接成字符串
NSString *orderSpec = [order description]; NSLog(@"orderSpec = %@",orderSpec);

//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循 RSA 簽名規(guī)范,并將簽名字符串 base64 編碼和 UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];

//將簽名成功字符串格式化為訂單字符串,請嚴(yán)格按照該格式NSString *orderString = nil;
if (signedString != nil) {

orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",

orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {

          NSLog(@"reslut = %@",resultDic);
}];

步驟4: 配置支付寶客戶端返回url處理方法.
如示例 AliSDKDemo\APAppDelegate.m 文件中,@implementation AppDelegate 中增加如下代碼:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {

//如果極簡 SDK 不可用,會跳轉(zhuǎn)支付寶錢包進(jìn)行支付,需要將支付寶錢包的支付結(jié)果回傳給 SDK
 if ([url.host isEqualToString:@"safepay"]) {

[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {

          NSLog(@"result = %@",resultDic);
       }];
}

if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權(quán)返回authCode

[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {

          NSLog(@"result = %@",resultDic);
       }];
}

return YES; }

三.md5
1僧叉、 導(dǎo)入頭文件:

#import<CommonCrypto/CommonDigest.h>  

2奕枝、加密的方法:

- (NSString *) md5:(NSString *) input {  
    const charchar *cStr = [input UTF8String];  
    unsigned char digest[CC_MD5_DIGEST_LENGTH];  
    CC_MD5( cStr, strlen(cStr), digest ); // This is the md5 call  
      
    NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];  
      
    for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)  
    [output appendFormat:@"%02x", digest[i]];  
      
    return  output;  
}  

3、調(diào)用加密方法:

NSString *str = @"123456";  
  
NSString *result = [self md5:str];  
  
NSLog(@"%@",result);   

四.sha1

//sha1加密方式
- (NSString *)getSha1String:(NSString *)srcString{
constchar *cstr = [srcString cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSDatadataWithBytes:cstr length:srcString.length];

uint8_t digest[CC_SHA1_DIGEST_LENGTH];

CC_SHA1(data.bytes, data.length, digest);

NSMutableString* result = [NSMutableStringstringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];

for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) {
       [result appendFormat:@"%02x", digest[i]];
   }

return result;
}
[resultLabel1setText:[selfgetSha1String:srcStringTextField.text]];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓶堕,一起剝皮案震驚了整個(gè)濱河市隘道,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖谭梗,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忘晤,死亡現(xiàn)場離奇詭異,居然都是意外死亡激捏,警方通過查閱死者的電腦和手機(jī)设塔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來远舅,“玉大人闰蛔,你說我怎么就攤上這事⊥及兀” “怎么了序六?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蚤吹。 經(jīng)常有香客問我例诀,道長,這世上最難降的妖魔是什么裁着? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任繁涂,我火速辦了婚禮,結(jié)果婚禮上跨算,老公的妹妹穿的比我還像新娘爆土。我一直安慰自己,他們只是感情好诸蚕,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布步势。 她就那樣靜靜地躺著,像睡著了一般背犯。 火紅的嫁衣襯著肌膚如雪坏瘩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天漠魏,我揣著相機(jī)與錄音潭千,去河邊找鬼腹备。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的慨绳。 我是一名探鬼主播饶唤,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敏簿,長吁一口氣:“原來是場噩夢啊……” “哼媳搪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞧毙,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胧华,失蹤者是張志新(化名)和其女友劉穎寄症,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體矩动,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡有巧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了悲没。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篮迎。...
    茶點(diǎn)故事閱讀 39,991評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖檀训,靈堂內(nèi)的尸體忽然破棺而出柑潦,到底是詐尸還是另有隱情,我是刑警寧澤峻凫,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站览露,受9級特大地震影響荧琼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜差牛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一命锄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧偏化,春花似錦脐恩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至韵卤,卻和暖如春骗污,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沈条。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工需忿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜡歹。 一個(gè)月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓屋厘,卻偏偏與公主長得像,于是被迫代替她去往敵國和親月而。 傳聞我的和親對象是個(gè)殘疾皇子汗洒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容