[关闭]
@zhuoming 2016-06-12T04:25:37.000000Z 字数 5100 阅读 1273

iOS支付宝集成(官方)

iOS 支付宝 alipay



本文写于 2016-4-9,参考官方开发文档

1. 准备工作

公司申请成为商家 商户签约审核

2、密钥

2.1 生成RSA密钥

  1. 打开终端 输入
    openssl
  2. 生成RSA私钥
    openssl> genrsa -out rsa_private_key.pem 1024
  3. 生成RSA公钥
    openssl> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
  4. 将RSA私钥转换成PKCS8格式
    openssl> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
  5. 你会得到以下图示
    2.pic.jpg-245.7kB
  6. 把黄色框框内(不包括--bigin-- 和 --end--)的字母复制出来,用编辑器(推荐使用sublime)打开,粘贴进去你会得到这样带空格换行的文本(注意左边的行号)
    3.pic.jpg-81kB
  7. 将行号去掉,并保存成.txt
    4.pic.jpg-82.6kB

TIPS
2、3、4前面的openssl>是自带的不需要输入的
如果没有明确的cd到某个具体路径 默认路径是用户根目录 /Users/yourUserName

2.2 上传密钥

参考上传密钥-官方文档

3、集成支付宝

这里集成的支付宝是为了在移动端方便,所以包含了一些本属于后台的工作

3.1 导入代码

导入代码-官方文档
1. 导入相应的库文件
2. 更改https
3. 重点将官方demo中的下列文件拖到项目中

  • AlipaySDK.bundle
  • AlipaySDK.framework
  • AliSDKDemo\Util及下面所有文件
  • AliSDKDemo\openssl及下面所有文件
  • libcrypto.a
  • libssl.a
  • Order.h
  • Order.m

3.2 针对Demo的运行注意

  1. command+B 运行报错 参考官方说明
  • 对于Cannot find interface declaration for 'NSObject', superclass of 'Base64' 等错误,只需在报错的地方导入相应的头文件。
  • 对于opssl的错误 点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字“search”搜索,对“Header Search
    Paths”增加头文件路径:$(SRCROOT)/项目名称。如果头文件信息已增加,可不必再增加。
  1. 添加URL Schemes

点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”,在“URL
Schemes”中输入“alisdkdemo”。“alisdkdemo”来自于文件“APViewController.m”的NSString
*appScheme = @“alisdkdemo”;。

3.3示例代码

  1. - (IBAction)btnBuyCLick:(UIButton *)sender {
  2. /**
  3. * 输入是否合法
  4. */
  5. if (!(_tfName.text.length > 0 && _tfPrice.text.length > 0 &&([self isPureInt:_tfPrice.text]||[self isPureFloat:_tfPrice.text]))) {
  6. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
  7. message:@"请填入合法的字符"
  8. delegate:self
  9. cancelButtonTitle:@"确定"
  10. otherButtonTitles:nil];
  11. [alert show];
  12. return;
  13. }
  14. /*============================================================================*/
  15. /*=======================需要填写商户app申请的===================================*/
  16. /*============================================================================*/
  17. NSString *partner = @"2088121427784129";
  18. NSString *seller = @"zhifubao@whunf.com.cn";
  19. NSString *privateKey = @"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMX/TsnXuiWmVB20UN9svlYc4sbLgPzTu8TarYnF1UZtcC5VP0VGLxlUTBywldDIq3p9UbnOt91avNvEV+PTAanyNeQy6iDG4/BZ7YhsSF8vTVgHbDaua/Aynz/Xb0kUX+o+E7LR6tRFNAqbEjPhatmhM62uIEM6hei3sFJFwUt1AgMBAAECgYEAjOvy8tw1JBjnI6E0MmFec0Hp8l3jd49nxGt0OmvxKUg5IPERsEeMvDVwWrcgWlKJIgxR/7Ju0QCFDNIJUCDdvAwPIAtjxweV3RugsASWXST5CqsyGtPpLnMZy7OdYFAT9hKkcEq+poUjbFpqDLFoRKfQqZD6tZM0/xbfxoZe8H0CQQDm9CoOqyrgHaTwa2aMvy64LXOKJL2NagFEevx0Vj7zvzFUOCynU1gSDDq3p2V20fdeQBBssceJrRigXy5OM4eTAkEA23gxKw7PSh+qyNL4i4kzpvQp/c336F/Gb7DUZrVqwb1gLnPXFvzsWodTu9g5p4+f8kckvw0H0U0mwy7BHJM11wJAKkjj9mGSbQwgacBQO065oBD6SX2mkuCosMAPvsEXr4r+3huW2V/iDRPeIEfuxM12i/QQzcXS8bsWei5TDRBULwJADumCxb8y3IF8VDrpgmmnJc/vTnyBPLvNOueT9wqan2FjuKRMWBaFZL1PNjNB7521q3ukBos3HcSVPqvdmThzbwJBAM1pjTSZ6FBMUMqJJJJgvfmiYUZ+5EwOsWObKl8WLqVR5trUEH1/483M5q+gD2GnGBjysdfCsKufoE7CtAGYctg=";
  20. /*============================================================================*/
  21. /*============================================================================*/
  22. /*============================================================================*/
  23. //partner和seller获取失败,提示
  24. if ([partner length] == 0 ||
  25. [seller length] == 0 ||
  26. [privateKey length] == 0)
  27. {
  28. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
  29. message:@"缺少partner或者seller或者私钥。"
  30. delegate:self
  31. cancelButtonTitle:@"确定"
  32. otherButtonTitles:nil];
  33. [alert show];
  34. return;
  35. }
  36. /*
  37. *生成订单信息及签名
  38. */
  39. //将商品信息赋予AlixPayOrder的成员变量
  40. Order *order = [[Order alloc] init];
  41. order.partner = partner;
  42. order.seller = seller;
  43. order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
  44. order.productName = _tfName.text; //商品标题
  45. order.productDescription = _tfName.text; //商品描述
  46. order.amount = [NSString stringWithFormat:@"%.2f",0.1]; //商品价格
  47. order.notifyURL = @"http://www.whunf.com.cn"; //回调URL
  48. order.service = @"mobile.securitypay.pay";
  49. order.paymentType = @"1";
  50. order.inputCharset = @"utf-8";
  51. order.itBPay = @"30m";
  52. order.showUrl = @"m.alipay.com";
  53. //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
  54. NSString *appScheme = @"AliPayDemo";
  55. //将商品信息拼接成字符串
  56. NSString *orderSpec = [order description];
  57. NSLog(@"orderSpec = %@",orderSpec);
  58. //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
  59. id<DataSigner> signer = CreateRSADataSigner(privateKey);
  60. NSString *signedString = [signer signString:orderSpec];
  61. //将签名成功字符串格式化为订单字符串,请严格按照该格式
  62. NSString *orderString = nil;
  63. if (signedString != nil) {
  64. orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
  65. orderSpec, signedString, @"RSA"];
  66. [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
  67. NSLog(@"reslut = %@",resultDic);
  68. }];
  69. }
  70. }
  71. #pragma mark -
  72. #pragma mark ==============产生随机订单号==============
  73. - (NSString *)generateTradeNO
  74. {
  75. static int kNumber = 15;
  76. NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  77. NSMutableString *resultStr = [[NSMutableString alloc] init];
  78. srand((unsigned)time(0));
  79. for (int i = 0; i < kNumber; i++)
  80. {
  81. unsigned index = rand() % [sourceStr length];
  82. NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
  83. [resultStr appendString:oneStr];
  84. }
  85. return resultStr;
  86. }
  87. #pragma mark ==============判断是否符合==============
  88. //判断是否为整形:
  89. - (BOOL)isPureInt:(NSString*)string{
  90. NSScanner* scan = [NSScanner scannerWithString:string];
  91. int val;
  92. return[scan scanInt:&val] && [scan isAtEnd];
  93. }
  94. //判断是否为浮点形:
  95. - (BOOL)isPureFloat:(NSString*)string{
  96. NSScanner* scan = [NSScanner scannerWithString:string];
  97. float val;
  98. return[scan scanFloat:&val] && [scan isAtEnd];
  99. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注