一、支付宝支付
支付宝官网:https://doc.open.alipay.com(蚂蚁金服开放平台)
1.支付宝支付流程

简单说就三个步骤:
1>生成订单(可以在客户端生成,也可以在服务器端生成)
2>调用支付宝支付接口,发送订单
3>处理支付宝返回的支付结果
2.关于签名校验
按理说,这些步骤完全够了,但是有一个安全性问题,你肯定不希望你接收的支付结果被截获修改,所以,这就需要在生成订单和处理支付结果的时候做一个安全性校验
生成订单时对数据签名,收到支付结果时对数据进行签名校验,以校验数据是否被篡改过
支付宝目前只支持RSA加密方式做签名校验,RSA加密算法,除了可加解密之外,还可以做签名校验,简单地说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你可以分发出去。做签名验证时,你可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据无篡改
具体到支付宝使用RSA做签名验证,就是在生产订单时,需要使用私钥生成签名值;在处理返回的支付结果时,需要使用公钥验证返回结果是否被篡改了
3.配置工程
3.1、导入SDK到工程中

3.2、添加系统静态依赖库
SystemConfiguration.framework
CoreTelephony.framework
QuartzCore.framework
CoreText.framework
CoreGraphics.framework
UIKit.framework
Foundation.framework
CFNetwork.framework
CoreMotion.framework
libc++.tbd
libz.tbd

3.3 修改SDK的路径
target-build setting-Header Search Paths (没用到)
3.4、 创建桥接文件

//预编译头文件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
支付宝头文件
#import "RSADataSigner.h"
#import <AliPaySDK/AliPaySDK.h>
#import "Order.h"
3.5、iOS9网络适配

添加白名单(否则无法调起支付宝客户端)
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- 支付宝 URL Scheme 白名单-->
<string>alipay</string>
<string>alipayshare</string>
</array>
3.6、设置应用Scheme
增加Scheme,方便支付宝客户端能够将支付结果返回,尽量保证Scheme唯一

报错解决:



3.7、实现支付
- AppDelegate

- 全局

实现
import UIKit
//支付流程:
//1.用户生成订单:可在客户端或服务端
//2.用户选择支付宝付款:调取用支付宝客户端胡支付网页
//3.支付宝服务器处理支付结果并将支付结果返回到用户
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func alipayAction(sender: AnyObject) {
//*******************订单设置
//创建订单
let order = Order()
//商户id:商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字)
order.partner = partner
//账户id:卖家支付宝账号对应的支付宝唯一用户号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
order.sellerID = seller
//订单号:商户网站商品对应的唯一订单号。一般由后台生成
order.outTradeNO = "201610261008" //随意
//资金总额:该笔订单的资金总额,单位为RMB(Yuan)。取值范围为[0.01,100000000.00],精确到小数点后两位。
order.totalFee = "0.01"
//交易说明:商品的标题/交易标题/订单标题/订单关键字等。
order.subject = "单身狗粮"
//商品具体描述:对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
order.body = "花式虐狗"
//*******************参数设置
//获取商品全部描述
let orderDes = order.description
//开始使用私钥签名(客户端执行,实际项目建议放在后台做,传输更安全)
let signer = CreateRSADataSigner(privateKey) as! RSADataSigner
//打包签名信息
signer.signString(orderDes)
//拼接商品信息
//参数1:商品全部描述
//参数2:打包后的签名信息
//参数3:校验方式RSA
let orderStr = String(format: "%@&sign=\"%@\"&sign_type=\"%@\"", orderDes,signer,"RSA")
//*********************支付
//发起支付请求
//参数1:拼接信息
//参数2: 回调的唯一标示
//参数3:支付之后的回调
AlipaySDK.defaultService().payOrder(orderStr, fromScheme: "CDiosAlipay") { (ret) -> Void in
}
}
}
二、银联支付
银联移动支付平台地址:https://open.unionpay.com/ajweb/product/detail?id=3;下载SDK
1.支付流程

流程图说明
(1)用户在客户端中点击购买商品,客户端发起订单生成请求到商户后台
(2)商户后台收到订单生成请求后,推送订单信息到银联后台
(3)银联后台接收订单信息并检查通过后,生成对应交易流水号,并回复至商户后台
(4)商户后台接收到交易流水号,将交易流水号返回至客户端
(5)客户端通过交易流水号调用支付控件
(6)用户在支付控件中输入相关支付信息后,由支付控件向银联后台发起支付请求
(7)支付成功后,银联后台将支付结果通知给商户后台
(8)银联后台同时也将支付结果通知支付控件
(9)支付控件显示支付结果并将支付结果返回至客户端
2.测试账号
以下是测试用卡号、手机号等信息(此类信息仅供测试使用,不会发生真实交易)
测试账号1:
招商银行借记卡:6226090000000048
手机号:18100000000
密码:111101
短信验证码:123456(先点获取验证码之后再输入)
证件类型:01身份证
证件号:510265790128303
姓名:张三
测试账号2:
华夏银行贷记卡:6226388000000095
手机号:18100000000
CVN2:248
有效期:1219
短信验证码:123456(先点获取验证码之后再输入)
证件类型:01身份证
证件号:510265790128303
姓名:张三
3.配置工程
3.1. 导入SDK
SDK包括两个文件:UPPaymentControl.h文件和libPaymentControl.a,将SDK目录添加到工程

3.2 添加系统依赖库
CFNetwork.framework
systemConfiguration.framework
libz.tbd
libc++.tbd

3.3 修改编译选项
targets-build settings -Linking-other linker flags 设置为-ObjC

如果该设置出现和其他第三方库冲突,或银联客户端莫名失效,可尝试去掉-ObjC,改为-force_load+空格+控件路径
3.4 设置应用Scheme
用于支付完成之后返回商户客户端

3.5 iOS9网络适配
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>

3.6添加协议白名单
<key>LSApplicationQueriesSchemes</key>
<array>
<string>uppaysdk</string>
<string>uppaywallet</string>
<string>uppayx1</string>
<string>uppayx2</string>
<string>uppayx3</string>
</array>

3.7 创建桥接文件
import "UPPaymentControl.h"

4 实现支付
服务器接口
为了从服务器获得交易流水号,银联提供了一个模拟接口:
http://101.231.204.84:8091/sim/getacptn
- Appdelegate

实现
import UIKit
//银联支付方式
//1.用户选择银联支付方式,将商品信息打包上传到公司服务器,公司服务器将信息推送到银联后台
//2.银联后台检查通过之后返回交易流水号到公司服务器,公司服务器在返回给用户
//3.客户端获取到交易流水号之后直接向银联支付控件发起请求
//4.回调得到支付结果
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func unionPayAction(sender: AnyObject) {
//公司服务器接口
//银联提供模拟接口:http://101.231.204.84:8091/sim/getacptn
//主要是为了获取交易流水号
let url = "http://101.231.204.84:8091/sim/getacptn"
//设置请求(可变请求)
let request = NSMutableURLRequest(URL: NSURL(string: url)!)
//请求方式
request.HTTPMethod = "GET"
//向公司发起请求,这里使用系统的NSURLSession,其他第三方网络请求也可以
let dataTask = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in
//请求交易流水号成功后的回调
//交易流水号
let tradeNo = NSString(data: data!, encoding: NSUTF8StringEncoding) as! String
//通过交易流水号发起银联支付
//参数1:交易流水号
//参数2:URL scheme
//参数3:当前环境,01表示测试,00表示正式环境
//参数4:执行当前操作的控制器
UPPaymentControl.defaultControl().startPay(tradeNo, fromScheme: "UnionPayCDios", mode: "01", viewController: self)
}
//开始发起支付请求
dataTask.resume()
}
}
三 微信支付
1.注册账号
注册步骤:
(1)首先在微信开放平台上注册,在账号中心填写开发者资质审核申请,等待审核通过。
(2)在管理中心注册应用,如果应用需要支付,则需填写企业资质、经营类目、结算账户
(3) 商户登录商户平台,填写结算账户
(4)在线签署《微信支付服务协议》
(5)获得微信支付能力
审核通过后,会在邮件中获取参数,分别是微信支付商户号、AppID和AppSecret,API秘钥在商户平台获得,AppID在客户端应用中会使用,AppSecret和微信支付商户号、API秘钥在服务器端使用
2.支付流程

流程图说明
(1)用户在商户APP中选择商品,提交订单,选择微信支付
(2)商户后台收到用户支付单,调用微信支付同意下单接口
(3)统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP,参与签名的字段名为appId,parterId,prepayId,nonceStr,timeStamp,package
(4)商户APP调起微信支付
(5)商户后台接收支付通知
(6)商户后台接收支付结果
3.配置工程
3.1 导入SDK,微信支付SDK包含WXApiObject.h,WXApi.h,WechatAuthSDK.h,libWeChatSDK.a四个文件
3.1 添加系统依赖库
systemConfiguration.framework
libc++
Foundation.framework
UIKit.frame
libsqlite3.tbd
libz.tbd
CoreTelephony.frame
Security.frame
3.2 设置应用Scheme
用于支付完成之后返回商户客户端
3.3 iOS9网络适配
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key><true/>
</dict>
3.4 创建桥接文件
#import <AVFoundation/AVFoundation.h>
#import "WXApiObject.h"
#import "WXApi.h"
3.5 实现支付
网友评论