一.微信支付流程
1.導(dǎo)入SDK
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
b.白名單
4.修改bitcode
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)入文件犁珠。
![Uploading 48_198784.png . . .]
2.里面有兩個(gè)文件是非arc的逻炊,我們需要設(shè)置一下 -fno-objc-arc
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]];