swift 移动支付之【支付宝支付】详细步骤

文章较长,请配合目录阅读⬆️


一.写在前面


完成了整个流程后,觉得集成起来还是不算难的,不过在集成的过程中也遇到了几个坑(也跟自己当时的理解能力有关),不过很多路走过来了就豁然开朗了


二.准备工作



1.向支付宝签约

这一步因为涉及到营业执照之类,一般有公司完成,在此不赘述了。步骤参考:申请支付宝签约流程

签约成功并添加应用后会得到两个重要参数

  • 商户ID:partner
  • 账号ID:seller 即支付宝账号

2.了解业务流程

官方流程图:

商户客户端即iOS客户端,支付业务流程:

  • 生成订单(可以在iOS客户端内生成,也可以在服务器端生成)
  • 调用支付宝支付接口,发送订单
  • 处理支付宝返回的支付结果

3.关于RSA验证

生成订单和处理支付结果的时候做一个安全性校验:生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。支付宝目前只支持采用RSA加密方式做签名验证。

简单说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你可以分发出去。接收方通过公钥对签名值做校验,如果一致则认为数据无篡改。

具体到支付宝使用RSA做签名验证,就是在生产订单时,需要使用私钥生成签名值;在处理返回的支付结果时,需要使用公钥验证返回结果是否被篡改了。

RSA公私钥生成方法

使用终端生成,所用命令及顺序

  1. cddesktop//进入桌面方便找到生成的文件
  2. openssl//打开openssl文件
  3. genrsa-outrsa_private_key.pem1024//生成私钥
  4. rsa-inrsa_private_key.pem-pubout-outrsa_public_key.pem//生成公钥
  5. pkcs8-topk8-informPEM-inrsa_private_key.pem-outformPEM-nocrypt//将RSA私钥转换成PKCS8格式


之后会生成如下文件,把私钥private格式改为txt打开即可取出私钥,使用时须删除-----BEGIN RSA PRIVATE KEY----- 、-----END RSA PRIVATE KEY----- 和中间多余的空格。





三.集成


1.下载SDK

下载开放平台SDK


2.添加SDK


新建AliPaySDK的文件夹,提取以下文件放入包里,然后把文件夹导入工程



添加所需的依赖库



3.设置URL Types (TARGETS-->Info)


4.编译项目,可能遇到的问题


1)"Unknown type name ‘NSString‘ "或者"Unknown type name ‘NSData‘ "等不识别常见类的问题。

未导入类库造成

解决办法:在报错的类里引入Foundation 和UIKit两个类库即可

  1. importUIKit
  2. importFoundation

2)‘openssl/asn1.h‘ file not found

头文件路径不正确导致

解决办法:Targets->Build Settings->Header Search Path中添加AliPaySDK文件夹的路径(拖拽此文件夹至输入框即可)

或 手动在header search paths 里添加支付宝SDK(openssl的路径);格式如下$(PROJECT_DIR)/文件夹名 这里说一下,直接点击openssl,然后showinfinder,然后command + i 查看路径,把得到路径的工程名字以后的部分加在文件夹名这OK了)


5.在桥接文件里导入所需头文件

  1. #import<AlipaySDK/AlipaySDK.h>
  2. #import"Order.h"
  3. #import"DataSigner.h"


四.编码部分


这一步要完成的就是把订单信息和签名信息提交到支付宝

一般分为在本地拼接订单信息、生成签名 和 服务端返回订单信息和签名两种情况,比较好的做法是后者,因为这样比把私钥放本地更加安全(所以让后台的兄弟去搞吧~),不过还是有必要说明两种情况。


1.本地完成

  1. funcAliplayFunc(){
  2. letOrders=Order()
  3. Orders.partner=""//支付宝的partner
  4. Orders.seller=""//支付宝的账号
  5. Orders.productName="我是一个订单"
  6. Orders.productDescription="thisisagoods"
  7. Orders.amount=NSString(format:"%.2f",TicketTotalprice)asString;//(价格必须小数点两位)
  8. Orders.tradeNO=Order.generateTradeNO()
  9. Orders.notifyURL="";//
  10. Orders.service="mobile.securitypay.pay"
  11. Orders.paymentType="1"
  12. Orders.inputCharset="utf-8"
  13. Orders.itBPay="30m"
  14. Orders.showUrl="m.alipay.com"
  15. letappScheme="AlipayDemo"
  16. letorderSpec=Orders.description;
  17. letsigner=CreateRSADataSigner("此处为秘钥");
  18. letsignedString=signer.signString(orderSpec);
  19. letorderString="\(orderSpec)&sign=\"\(signedString)\"&sign_type=\"RSA\"";
  20. AlipaySDK.defaultService().payOrder(orderString,fromScheme:appScheme,callback:{(resultDic)->Voidin
  21. print("reslut=\(resultDic)");
  22. ifletAlipayjson=resultDicas?NSDictionary{
  23. letresultStatus=Alipayjson.valueForKey("resultStatus")as!String
  24. ifresultStatus=="9000"{
  25. print("OK")
  26. }elseifresultStatus=="8000"{
  27. print("正在处理中")
  28. self.navigationController?.popViewControllerAnimated(true)
  29. }elseifresultStatus=="4000"{
  30. print("订单支付失败");
  31. self.navigationController?.popViewControllerAnimated(true)
  32. }elseifresultStatus=="6001"{
  33. print("用户中途取消")
  34. self.navigationController?.popViewControllerAnimated(true)
  35. }elseifresultStatus=="6002"{
  36. print("网络连接出错")
  37. self.navigationController?.popViewControllerAnimated(true)
  38. }
  39. }
  40. })
  41. }

2.服务端完成

我们服务器返回的数据格式:

这种情况需要服务端返回所需的拼接好的订单信息 orderString 以及签名好的 sign。不过需要注意的是要在调用

  1. letorderString="\(<spanstyle="color:rgb(51,51,51);font-family:Arial;font-size:14px;">orderString</span>)&sign=\"\(signedString)\""//&sign_type=\"RSA\"
  2. AlipaySDK.defaultService().payOrder(orderString,callback:


前把sign进行转码,
即执行SDK中的RSASataSigner这个类里的urlEncodedString方法



你可以想办法调用这个方法处理sign,也可以在自己的类里添加swift版本的处理方法,然后调用。方法为:

  1. //支付宝转码
  2. funcurlEncodedString(string:NSString)->NSString{
  3. letencodeString=CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,string,nil,"!*'();:@&=+$,/?%#[]",CFStringGetSystemEncoding())
  4. returnencodeString
  5. }

或(这个编码函数是经人指点从alamofire的源代码里拿的)
  1. funcescape(string:String)->String{
  2. letgeneralDelimitersToEncode=":#[]@"//doesnotinclude"?"or"/"duetoRFC3986-Section3.4
  3. letsubDelimitersToEncode="!$&'()*+,;="
  4. letallowedCharacterSet=NSCharacterSet.URLQueryAllowedCharacterSet().mutableCopy()as!NSMutableCharacterSet
  5. allowedCharacterSet.removeCharactersInString(generalDelimitersToEncode+subDelimitersToEncode)
  6. varescaped=""
  7. if#available(iOS8.3,OSX10.10,*){
  8. escaped=string.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet)??string
  9. }else{
  10. letbatchSize=50
  11. varindex=string.startIndex
  12. whileindex!=string.endIndex{
  13. letstartIndex=index
  14. letendIndex=index.advancedBy(batchSize,limit:string.endIndex)
  15. letrange=Range(start:startIndex,end:endIndex)
  16. letsubstring=string.substringWithRange(range)
  17. escaped+=substring.stringByAddingPercentEncodingWithAllowedCharacters(allowedCharacterSet)??substring
  18. index=endIndex
  19. }
  20. }
  21. returnescaped
  22. }

之后在执行提交数据的方法即可
  1. letsignedString=urlEncodedString(sign)
  2. letorderString="\(info)&sign=\"\(signedString)\""//&sign_type=\"RSA\"
  3. AlipaySDK.defaultService().payOrder(orderString,callback:{(resultDic)->Voidin

3.处理回调

AppDelegate 里
  1. funcapplication(application:UIApplication,openURLurl:NSURL,sourceApplication:String?,annotation:AnyObject)->Bool
  2. {
  3. //跳转支付宝钱包进行支付,处理支付结果
  4. AlipaySDK.defaultService().processOrderWithPaymentResult(url,standbyCallback:
  5. {(resultDict:[NSObject:AnyObject]!)->Voidin
  6. print("openURLresult:\(resultDict)")
  7. })
  8. returntrue
  9. }

参考文章:

集成相关

RSA签名、私钥公钥相关

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


软件简介:蓝湖辅助工具,减少移动端开发中控件属性的复制和粘贴.待开发的功能:1.支持自动生成约束2.开发设置页面3.做一个浏览器插件,支持不需要下载整个工程,可即时操作当前蓝湖浏览页面4.支持Flutter语言模板生成5.支持更多平台,如Sketch等6.支持用户自定义语言模板
现实生活中,我们听到的声音都是时间连续的,我们称为这种信号叫模拟信号。模拟信号需要进行数字化以后才能在计算机中使用。目前我们在计算机上进行音频播放都需要依赖于音频文件。那么音频文件如何生成的呢?音频文件的生成过程是将声音信息采样、量化和编码产生的数字信号的过程,我们人耳所能听到的声音频率范围为(20Hz~20KHz),因此音频文件格式的最大带宽是20KHZ。根据奈奎斯特的理论,音频文件的采样率一般在40~50KHZ之间。奈奎斯特采样定律,又称香农采样定律。...............
前言最近在B站上看到一个漂亮的仙女姐姐跳舞视频,循环看了亿遍又亿遍,久久不能离开!看着小仙紫姐姐的蹦迪视频,除了一键三连还能做什么?突发奇想,能不能把舞蹈视频转成代码舞呢?说干就干,今天就手把手教大家如何把跳舞视频转成代码舞,跟着仙女姐姐一起蹦起来~视频来源:【紫颜】见过仙女蹦迪吗 【千盏】一、核心功能设计总体来说,我们需要分为以下几步完成:从B站上把小姐姐的视频下载下来对视频进行截取GIF,把截取的GIF通过ASCII Animator进行ASCII字符转换把转换的字符gif根据每
【Android App】实战项目之仿抖音的短视频分享App(附源码和演示视频 超详细必看)
前言这一篇博客应该是我花时间最多的一次了,从2022年1月底至2022年4月底。我已经将这篇博客的内容写为论文,上传至arxiv:https://arxiv.org/pdf/2204.10160.pdf欢迎大家指出我论文中的问题,特别是语法与用词问题在github上,我也上传了完整的项目:https://github.com/Whiffe/Custom-ava-dataset_Custom-Spatio-Temporally-Action-Video-Dataset关于自定义ava数据集,也是后台
因为我既对接过session、cookie,也对接过JWT,今年因为工作需要也对接了gtoken的2个版本,对这方面的理解还算深入。尤其是看到官方文档评论区又小伙伴表示看不懂,所以做了这期视频内容出来:视频在这里:本期内容对应B站的开源视频因为涉及的知识点比较多,视频内容比较长。如果你觉得看视频浪费时间,可以直接阅读源码:goframe v2版本集成gtokengoframe v1版本集成gtokengoframe v2版本集成jwtgoframe v2版本session登录官方调用示例文档jwt和sess
【Android App】实战项目之仿微信的私信和群聊App(附源码和演示视频 超详细必看)
用Android Studio的VideoView组件实现简单的本地视频播放器。本文将讲解如何使用Android视频播放器VideoView组件来播放本地视频和网络视频,实现起来还是比较简单的。VideoView组件的作用与ImageView类似,只是ImageView用于显示图片,VideoView用于播放视频。...
采用MATLAB对正弦信号,语音信号进行生成、采样和内插恢复,利用MATLAB工具箱对混杂噪声的音频信号进行滤波
随着移动互联网、云端存储等技术的快速发展,包含丰富信息的音频数据呈现几何级速率增长。这些海量数据在为人工分析带来困难的同时,也为音频认知、创新学习研究提供了数据基础。在本节中,我们通过构建生成模型来生成音频序列文件,从而进一步加深对序列数据处理问题的了解。
基于yolov5+deepsort+slowfast算法的视频实时行为检测。1. yolov5实现目标检测,确定目标坐标 2. deepsort实现目标跟踪,持续标注目标坐标 3. slowfast实现动作识别,并给出置信率 4. 用框持续框住目标,并将动作类别以及置信度显示在框上
数字电子钟设计本文主要完成数字电子钟的以下功能1、计时功能(24小时)2、秒表功能(一个按键实现开始暂停,另一个按键实现清零功能)3、闹钟功能(设置闹钟以及到时响10秒)4、校时功能5、其他功能(清零、加速、星期、八位数码管显示等)前排提示:前面几篇文章介绍过的内容就不详细介绍了,可以看我专栏的前几篇文章。PS.工程文件放在最后面总体设计本次设计主要是在前一篇文章 数字电子钟基本功能的实现 的基础上改编而成的,主要结构不变,分频器将50MHz分为较低的频率备用;dig_select
1.进入官网下载OBS stdioOpen Broadcaster Software | OBS (obsproject.com)2.下载一个插件,拓展OBS的虚拟摄像头功能链接:OBS 虚拟摄像头插件.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)提取码:6656--来自百度网盘超级会员V1的分享**注意**该插件必须下载但OBS的根目录(应该是自动匹配了的)3.打开OBS,选中虚拟摄像头选择启用在底部添加一段视频录制选择下面,进行录制.
Meta公司在9月29日首次推出一款人工智能系统模型:Make-A-Video,可以从给定的文字提示生成短视频。基于**文本到图像生成技术的最新进展**,该技术旨在实现文本到视频的生成,可以仅用几个单词或几行文本生成异想天开、独一无二的视频,将无限的想象力带入生活
音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结一、前言之前一直对硬件上的内容比较关注,但是可能是因为硬件方面的东西可能真的是比较杂,而且需要渗透的东西太多了,所以学习进展比较缓慢。因为也很少有单纯的硬件学习研究,总是会伴随着各种理论需要硬件做支撑,所以还是想要慢慢接触理论学习。但是之前总找不到切入点,不知道从哪里开始,就一直拖着。最近稍微接触了一点信号处理,就用这个当作切入点,开始接触理论学习。二、信号分析及加噪信号处理选用了matlab做工具,选了一个最简单的语音信号处理方
腾讯云 TRTC 实时音视频服务体验,从认识 TRTC 到 TRTC 的开发实践,Demo 演示& IM 服务搭建。
音乐音频分类技术能够基于音乐内容为音乐添加类别标签,在音乐资源的高效组织、检索和推荐等相关方面的研究和应用具有重要意义。传统的音乐分类方法大量使用了人工设计的声学特征,特征的设计需要音乐领域的知识,不同分类任务的特征往往并不通用。深度学习的出现给更好地解决音乐分类问题提供了新的思路,本文对基于深度学习的音乐音频分类方法进行了研究。首先将音乐的音频信号转换成声谱作为统一表示,避免了手工选取特征存在的问题,然后基于一维卷积构建了一种音乐分类模型。
C++知识精讲16 | 井字棋游戏(配资源+视频)【赋源码,双人对战】
本文主要讲解如何在Java中,使用FFmpeg进行视频的帧读取,并最终合并成Gif动态图。
在本篇博文中,我们谈及了 Swift 中 some、any 关键字以及主关联类型(primary associated types)的前世今生,并由浅及深用简明的示例向大家讲解了它们之间的奥秘玄机。