和支付宝签约后,支付宝会为每个商户分配一个唯一的parnter和seller。(根据parnter和seller支付宝网站上拿到公钥,然后根据支付宝加密算法RSA,公钥->得到私钥,好像是这样(记不请了),详细的参考支付宝官方文档)
公私钥存放在plist中,商户可以存放在服务端或本地其他地方。
AppDelegate.m
//支付宝有支付结果后回到本应用
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
[self parseURL:url application:application];
return YES;
}
- (void)parseURL:(NSURL *)url application:(UIApplication *)application {
AlixPay *alixpay = [AlixPay shared];
AlixPayResult *result = [alixpay handleOpenURL:url];
if (result) {
//是否支付成功
if (9000 == result.statusCode) {
/*
*用公钥验证签名
*/
id<DataVerifier> verifier = CreateRSADataVerifier([[NSBundle mainBundle] objectForInfoDictionaryKey:@"RSA public key"]);
if ([verifier verifyString:result.resultString withSign:result.signString]) {
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示"
message:result.statusMessage
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
alertView.tag=201;
[alertView show];
[alertView release];
}//验签错误
else {
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"签名错误"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
alertView.tag=202;
[alertView show];
[alertView release];
}
}
//如果支付失败,可以通过result.statusCode查询错误码
else {
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示"
message:result.statusMessage
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
alertView.tag=203;
[alertView show];
[alertView release];
}
}
}
生产订单和调用支付
//支付宝支付
-(void)zhifubaoPay
{
//调用支付宝
/*
*商户的唯一的parnter和seller。
*本demo将parnter和seller信息存于(AlixPayDemo-Info.plist)中,外部商户可以考虑存于服务端或本地其他地方。
*签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
*/
//如果partner和seller数据存于其他位置,请改写下面两行代码
NSString *partner = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Partner"];
NSString *seller = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Seller"];
//partner和seller获取失败,提示
if ([partner length] == 0 || [seller length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少partner或者seller。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
[alert release];
return;
}
/*
*生成订单信息及签名
*由于demo的局限性,本demo中的公私钥存放在AlixPayDemo-Info.plist中,外部商户可以存放在服务端或本地其他地方。
*/
//将商品信息赋予AlixPayOrder的成员变量
AlixPayOrder *order = [[AlixPayOrder alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = _orderID; //订单ID(由商家自行制定)
order.productName = @"标题"; //商品标题
order.productDescription = @"描述"; //商品描述
order.amount = [NSString stringWithFormat:@"%.2f",_ZFBpayMoney]; //商品价格
order.notifyURL = [NSString stringWithFormat:@"http://%@/alipay/notifyurl",SERVER_URL]; //回调URL(应该是回调给服务器的,这个作用好像是支付结果返回给服务端的)
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types,用于快捷支付成功后重新唤起商户应用
//NSString *appScheme = @"AlixPayDemo";
NSString *appScheme=@"backMyApp";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
//NSLog(@"orderSpec = %@",orderSpec);
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner([[NSBundle mainBundle] objectForInfoDictionaryKey:@"RSA private key"]);
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
//获取快捷支付单例并调用快捷支付接口
AlixPay * alixpay = [AlixPay shared];
int ret = [alixpay pay:orderString applicationScheme:appScheme];
if (ret == kSPErrorAlipayClientNotInstalled) {
UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"您还没有安装支付宝快捷支付,请先安装。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alertView setTag:123];
[alertView show];
[alertView release];
}
else if (ret == kSPErrorSignError) {
NSLog(@"签名错误!");
}
}
}
//安装插件
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
//进入appstore下载快捷支付软件
if (alertView.tag == 123) {
NSString * URLString = @"http://itunes.apple.com/cn/app/id535715926?mt=8";
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:URLString]];
}
}