支付宝IOS2.2.1支付
将Demo中AlipaySDK.bundle AlipaySDK.framework libel.a lib crypto.a openssl Util加入到工程,在需要调用的地方加#import
-(void)apily{
/*
*商户的唯一的parnter和seller。
*签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
*/
/*============================================================================*/
/*=======================需要填写商户app申请的===================================*/
/*============================================================================*/
NSString *partner = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Partner"];
NSString *seller = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Seller"];
NSString *privateKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"RSA private key"];
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
//partner和seller获取失败,提示
if ([partner length] == 0 ||
[seller length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少partner或者seller或者私钥。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
return;
}
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = [self.dict valueForKey:@"orderNumber"]; //订单ID(由商家自行制定)
order.productName =@"标题"; //商品标题
order.productDescription = @"描述"; //商品描述
order.amount =self.strMoney; //商品价格
// order.amount =@"0.01"; //商品价格
order.notifyURL = @"http://test.testcom.cn:8081/phone/test/shopRechageRequestAlipayResult.htm"; //回调URL
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay =[CommonUtils getDateForStringTime:[self.dict valueForKey:@"disableTime"] withFormat:nil];
order.showUrl = @"m.alipay.com";
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme = @"mddy";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"~~~~~~~~~~~~~~~~~~~~~~~~~~~orderSpec = %@",orderSpec);
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
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);
NSLog(@"@@@memo = %@,resultStatus =%@",[resultDic valueForKey:@"memo"],[resultDic valueForKey:@"resultStatus"]);
if ([[[resultDic valueForKey:@"resultStatus"] toString]isEqualToString:@"9000"]) {
[[NSNotificationCenter defaultCenter]postNotificationName:ZHIDURESULT object:self userInfo:@{@"info":@"1"}];
}else{
[[NSNotificationCenter defaultCenter]postNotificationName:ZHIDURESULT object:self userInfo:@{@"info":@"0"}];
}
}];
}
}
上面这段代码,payOrder 没有客户端的情况是从这里进的,支付流程中响应事件也是这个方法,但当客户端的时候,auth_V2WithInfo 会进入,响应事件的方法是下面processAuth_V2Result 方法,但是,当payOrder ,auth_V2WithInfo 在一起的时候,会很纠结,结果是wap或者客户端总有一个回调方法不响应,可能是自己搞不清文档的意思,可是你妹的写清楚点行不。然后,wap的时候进入的方法不变,客户端的时候响应方法加上processOrderWithPaymentResult ,你会发现,响应的方法和wap的方法是同一个,好像是把支付流程重新传入了payOrder里边。
#define ZHIDURESULT @"zhifuResult" //收到支付后发出
RechQueRenViewController.m文件
- (void)viewDidLoad {
[super viewDidLoad];
self.navigationController.navigationBar.barTintColor = [UIColor colorWithHex:0xededed];
self.navigationItem.hidesBackButton = YES;
UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"backWithTitle.png"] forState:UIControlStateNormal];
button.frame = CGRectMake(0, 0, 53, 19);
UIBarButtonItem* rithtBarItem = [[UIBarButtonItem alloc]initWithCustomView:button];
[button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = rithtBarItem ;
button = nil;
rithtBarItem = nil;
self.title = @"充值确认";
self.tableView =[[UITableView alloc]initWithFrame:CGRectMake(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT-64) style:UITableViewStyleGrouped];
self.tableView.delegate =self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
self.isAiLiPay = YES;
UIButton* buttonCancel = [UIButton buttonWithType:UIButtonTypeCustom];
[buttonCancel addTarget:self action:@selector(buttonPressedQueRen) forControlEvents:UIControlEventTouchUpInside];
[buttonCancel setTitle:@"确认支付" forState:UIControlStateNormal];
float red = 252/255.0;
float green = 102/255.0;
float blue = 5/255.0;
[buttonCancel setBackgroundColor: [UIColor colorWithRed:red green:green blue:blue alpha:1.0]];
buttonCancel.layer.cornerRadius = 3;
// buttonCancel.frame = CGRectMake(16, 195+80+50, WINDOW_WIDTH-32, 44);
// [self.tableView addSubview:buttonCancel];
buttonCancel.frame = CGRectMake(16, WINDOW_HEIGHT-44-64-10, WINDOW_WIDTH-32, 44);
[self.view addSubview:buttonCancel];
self.tableView.bounces = NO;
self.isCanPay = YES;
self.isCanAlert =YES;
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(zhifuResult:) name:ZHIDURESULT object:nil];
// Do any additional setup after loading the view.
}
-(void)zhifuResult:(NSString*)result{
if (self.timer) {
[self.timer invalidate];
self.timer = nil;
}
if ([result isEqualToString:@"1"]) {
for (UIViewController* vc in self.navigationController.viewControllers) {
if ([vc isKindOfClass:[AccountRechargeViewController class]]) {
[self.navigationController popToViewController:vc animated:YES];
}
}
[[NSNotificationCenter defaultCenter]postNotificationName:ZHIFUSUCCESS object:self];
}else{//建行支付失败,返回到支付页面,进行提示
[self.navigationController popViewControllerAnimated:YES];
[[NSNotificationCenter defaultCenter]postNotificationName:ZHIDURESULT object:self userInfo:@{@"info":@"0"}];
}
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//
// [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
// NSLog(@"result = %@",resultDic);
// NSString *resultStr = resultDic[@"result"];
// NSLog(@"memo = %@,resultStatus =%@",[resultDic valueForKey:@"memo"],[resultDic valueForKey:@"resultStatus"]);
//
// if ([[[resultDic valueForKey:@"resultStatus"] toString]isEqualToString:@"9000"]) {
//
// }else{
//
// }];
[[AlipaySDK defaultService]processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
// if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
// [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
// NSLog(@"result = %@",resultDic);
// }];
// }
return YES;
}
notifyURL 是客户端传给支付宝的,当客户端支付完成后,支付宝会根据这个url异步调用服务端的接口,同步支付结果的数据,这个要服务器给的,确保你的私钥,合作者id是准确的。
建设银行支付
只支持html5的方式访问,建行等N多银行没有提供由生态系统直接实现的SDK,当然html5页面的建行支付需要我们伟大的前端工程师实现了,我们只能通过向服务器发送请求加载html5页面。
注意:html5有四种加载方式。
第一种,在h5页面加入工程,本地加载方式。
第二种,判断本地是否有h5页面文件,若没有向服务发送文件请求,下载h5页面,然后本地加载。
第三种,不经过服务器以加载页面的方式加载页面。
第四种,向服务器发送请求获得html5页面的加载方式。
详细的见博客:http://blog.csdn.net/jia12216/article/details/46966425
下面是以第四种方式加载h5页面为例子。
JianHangWebView.m文件
- (void)viewDidLoad {
self.title = @"建行卡支付";
[self jianHangPay];
self.navigationController.navigationBar.barTintColor = [UIColor colorWithHex:0xededed];
self.button = [UIButton buttonWithType:UIButtonTypeCustom];
[self.button setTitle:@"00:00" forState:UIControlStateNormal];
[self.button setTitleColor:UICOLOR(248, 78, 11, 1) forState:UIControlStateNormal];
self.button.frame = CGRectMake(0, 0, 53, 19);
UIBarButtonItem* rithtBarItem = [[UIBarButtonItem alloc]initWithCustomView:self.button];
self.navigationItem.rightBarButtonItem = rithtBarItem ;
rithtBarItem = nil;
self.navigationItem.hidesBackButton = YES;
UIButton* button1 = [UIButton buttonWithType:UIButtonTypeCustom];
[button1 setImage:[UIImage imageNamed:@"backWithTitle.png"] forState:UIControlStateNormal];
button1.frame = CGRectMake(0, 0, 53, 19);
UIBarButtonItem* leftBarItem = [[UIBarButtonItem alloc]initWithCustomView:button1];
[button1 addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
self.navigationItem.leftBarButtonItem = leftBarItem ;
button1 = nil;
leftBarItem = nil;
if (self.timer) {
[self.timer invalidate];
self.timer = nil;
}
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(progressTimerChangeJianHang) userInfo:nil repeats:YES];
[self.timer fire];
}
-(void)jianHangPay{
self.view.backgroundColor = [UIColor colorWithHex:0xf5f5f5];
if (!self.webView) {
self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT-64)];
self.webView.backgroundColor = [UIColor whiteColor];
[self.webView setScalesPageToFit:YES];
[self.view addSubview:self.webView];
[WebViewJavascriptBridge enableLogging];
_bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
FLDDLogDebug(@"ObjC received message from JS: %@", data);
responseCallback(@"Response for message from ObjC");
}];
// [_bridge registerHandler:@"testJavascriptHandler" handler:^(id data, WVJBResponseCallback responseCallback) {
// FLDDLogDebug(@"reloadPage");
// // [self reLoginReloadPage];
// }];
[_bridge registerHandler:@"mddyCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
FLDDLogDebug(@"testObjcCallback called: %@", data);
NSString *html = [data toString];
// NSLog(@"%@",html);
if ([html isEqualToString:@"true"]) {
[self zhifuResult:@"1"];
}else{
// [self resultFailReXiaDan];
[self zhifuResult:@"0"];
}
responseCallback(@"Response from testObjcCallback");
}];
// [_bridge registerHandler:@"WebViewJavascriptBridgeReady" handler:^(id data, WVJBResponseCallback responseCallback) {
// FLDDLogDebug(@"testObjcCallback called: %@", data);
//
//
// NSString *html = [data toString];c
// NSLog(@"%@",html);
//
// responseCallback(@"Response from testObjcCallback");
// }];
[_bridge send:@"123"];
// [_bridge send:@"A string sent from ObjC to JS" responseCallback:^(id response) {
// NSLog(@"sendMessage got response: %@", response);
// }];
NSURLRequest *request = [User getBookPageRequestWithOrderNumb:[self.dict valueForKey:@"orderNumber"]];
if(request != nil)
{
[self.webView loadRequest:request];
}
}
}
现在的公司代码不能贴出来。分享下支付功能模块化后的调用流程图吧!对咱们程序猿来说,流程图比实际的代码更重要,可以根据流程图做出不同的模块,完全抄袭不单牵涉到知识产权问题,也不利于扩展。