1.第一步在程序入口注册微信  (支付宝不需要)

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
//向微信终端程序注册第三方应用
WXApi.registerApp(WX_APPID)
}

  2.微信支付管理类客户端只负责调用(支付信息什么的都是服务器完成的)

import UIKit
//微信appid
let WX_APPID=""
//AppSecret
let SECRET=""
//微信
class WXApiManager:NSObject,WXApiDelegate {
static let shared = WXApiManager()
// 用于弹出警报视图,显示成功或失败的信息()
private weak var sender:BaseViewController! //(UIViewController)
// 支付成功的闭包
private var paySuccessClosure: (() -> Void)?
// 支付失败的闭包
private var payFailClosure: (() -> Void)?
//登录成功
private var loginSuccessClosure:((_ code:String) -> Void)?
//登录失败
private var loginFailClosure:(() -> Void)?
// 外部用这个方法调起微信支付
func payAlertController(_ sender:BaseViewController,
request:PayReq,
paySuccess: @escaping () -> Void,
payFail:@escaping () -> Void) {
// sender 是调用这个方法的控制器,
// 用于提示用户微信支付结果,可以根据自己需求是否要此参数。
self.sender = sender
self.paySuccessClosure = paySuccess
self.payFailClosure = payFail
if checkWXInstallAndSupport(){//检查用户是否安装微信
WXApi.send(request)
}
}
//外部用这个方法调起微信登录
func login(_ sender:BaseViewController,loginSuccess: @escaping ( _ code:String) -> Void,
loginFail:@escaping () -> Void){
// sender 是调用这个方法的控制器,
// 用于提示用户微信支付结果,可以根据自己需求是否要此参数。
self.sender = sender
self.loginSuccessClosure = loginSuccess
self.loginFailClosure = loginFail
if checkWXInstallAndSupport(){
let req=SendAuthReq()
req.scope="snsapi_userinfo"
req.state="app"
WXApi.send(req)
}
} }
extension WXApiManager {
func onResp(_ resp: BaseResp!) {
if resp is PayResp {//支付
if resp.errCode == 0 {
self.paySuccessClosure?()
}else{
self.payFailClosure?()
}
}else if resp is SendAuthResp{//登录结果
let authResp = resp as! SendAuthResp
var strMsg: String
if authResp.errCode == 0{
strMsg="微信授权成功"
}else{
switch authResp.errCode{
case -4:
strMsg="您拒绝使用微信登录"
break
case -2:
strMsg="您取消了微信登录"
break
default:
strMsg="微信登录失败"
break
}
}
UIAlertController.showAlertYes(sender, title: "授权结果", message: strMsg, okButtonTitle:"确定", okHandler: { (alert) in
if authResp.errCode == 0 {
self.loginSuccessClosure?(authResp.code) }else{
self.loginFailClosure?()
}
})
}
}
} extension WXApiManager {
// 检查用户是否已经安装微信并且有支付功能
private func checkWXInstallAndSupport() -> Bool {
if !WXApi.isWXAppInstalled() {
///这里的弹窗是我写的扩展方法
UIAlertController.showAlertYes(sender,title:"", message: "微信未安装", okButtonTitle:"确定")
return false
}
if !WXApi.isWXAppSupport() {
///这里的弹窗是我写的扩展方法
UIAlertController.showAlertYes(sender,title:"", message: "当前微信版本不支持支付", okButtonTitle:"确定")
return false
}
return true
}
}

3. 支付宝管理类客户端只负责调用(支付信息什么的都是服务器完成的)

//支付宝
class AliPayManager:NSObject{
static let shared = AliPayManager()
// 用于弹出警报视图,显示成功或失败的信息
fileprivate weak var sender: UIViewController!
// 支付成功的闭包
fileprivate var paySuccessClosure: (() -> Void)?
// 支付失败的闭包
fileprivate var payFailClosure: (() -> Void)?
///登录成功的闭包
fileprivate var loginSuccessClosure:((_ auth_code:String) -> Void)?
///登录失败的闭包
fileprivate var loginFailClosure:(() -> Void)?
// 外部用这个方法调起支付支付
func payAlertController(_ sender: UIViewController,
request:String,
paySuccess: @escaping () -> Void,
payFail:@escaping () -> Void) {
// sender 是调用这个方法的控制器,
self.sender = sender
//用于提示用户支付宝支付结果,可以根据自己需求是否要此参数。
self.paySuccessClosure = paySuccess
self.payFailClosure = payFail
AlipaySDK.defaultService().payOrder(request, fromScheme:"这里是URL Types配置的URLShcemes",callback:nil)
}
//外部用这个方法调起支付宝登录
func login(_ sender:BaseViewController,withInfo:String,loginSuccess: @escaping (_ str:String) -> Void,loginFail:@escaping () -> Void){
// sender 是调用这个方法的控制器,
// 用于提示用户微信支付结果,可以根据自己需求是否要此参数。
self.sender = sender
self.loginSuccessClosure = loginSuccess
self.loginFailClosure = loginFail
AlipaySDK.defaultService().auth_V2(withInfo:withInfo, fromScheme:"这里是URL Types配置的URLSchemes", callback:nil)
}
///授权回调
func showAuth_V2Result(result:NSDictionary){
// 9000 请求处理成功
// 4000 系统异常
// 6001 用户中途取消
// 6002 网络连接出错
let returnCode:String = result["resultStatus"] as! String
var returnMsg:String = ""
switch returnCode{
case "6001":
returnMsg = "用户中途取消"
break
case "6002":
returnMsg = "网络连接出错"
break
case "4000":
returnMsg = "系统异常"
break
case "9000":
returnMsg = "授权成功"
break
default:
returnMsg = "系统异常"
break
}
UIAlertController.showAlertYes(sender, title: "授权结果", message: returnMsg, okButtonTitle:"确定", okHandler: { (alert) in
if returnCode == "9000" {
let r=result["result"] as! String
self.loginSuccessClosure?(r) }else{
self.loginFailClosure?()
}
})
}
//传入回调参数
func showResult(result:NSDictionary){
// 9000 订单支付成功
// 8000 正在处理中
// 4000 订单支付失败
// 6001 用户中途取消
// 6002 网络连接出错
let returnCode:String = result["resultStatus"] as! String
// var returnMsg:String = ""
// switch returnCode{
// case "6001":
// returnMsg = "用户中途取消"
// break
// case "6002":
// returnMsg = "网络连接出错"
// break
// case "8000":
// returnMsg = "正在处理中"
// break
// case "4000":
// returnMsg = "订单支付失败"
// break
// case "9000":
// returnMsg = "支付成功"
// break
// default:
// returnMsg = "订单支付失败"
// break
// }
// UIAlertController.showAlertYes(sender, title: "支付结果", message: returnMsg, okButtonTitle:"确定", okHandler: { (alert) in
// if returnCode == "9000" {
// self.paySuccessClosure?()
//
// }else{
// self.payFailClosure?()
// }
// })
if returnCode == "9000" {
self.paySuccessClosure?() }else{
self.payFailClosure?()
}
}
}

4.在AppDelegate中回调

// MARK: - 支付回调
extension AppDelegate{
// iOS 8 及以下请用这个
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
if url.host == "safepay"{//支付宝
//支付回调
AlipaySDK.defaultService().processOrder(withPaymentResult: url, standbyCallback:{ (resultDic) in
if resultDic != nil{
AliPayManager.shared.showResult(result:resultDic! as NSDictionary)
}
})
//授权回调
AlipaySDK.defaultService().processAuth_V2Result(url, standbyCallback: { (resultDic) in
if resultDic != nil{
AliPayManager.shared.showAuth_V2Result(result:resultDic! as NSDictionary)
}
})
return true
}else{//微信
return WXApi.handleOpen(url, delegate:WXApiManager.shared)
} }
// iOS 9 以上请用这个
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
if url.host == "safepay"{//支付宝
//支付回调
AlipaySDK.defaultService().processOrder(withPaymentResult: url, standbyCallback:{ (resultDic) in
if resultDic != nil{
AliPayManager.shared.showResult(result:resultDic! as NSDictionary)
}
})
//授权回调
AlipaySDK.defaultService().processAuth_V2Result(url, standbyCallback: { (resultDic) in
if resultDic != nil{
AliPayManager.shared.showAuth_V2Result(result:resultDic! as NSDictionary)
}
})
return true
}else{//微信
return WXApi.handleOpen(url,delegate:WXApiManager.shared)
}
}
}

5.支付调用 这里拿数据是用SwiftyJSON

1.微信支付
///从服务器拿到生成好的请求参数
let charge=json["charge"]
let req=PayReq()
req.timeStamp=charge["timestamp"].uInt32Value
req.partnerId=charge["partnerid"].stringValue
req.package=charge["package"].stringValue
req.nonceStr=charge["noncestr"].stringValue
req.sign=charge["sign"].stringValue
req.prepayId=charge["prepayid"].stringValue
WXApiManager.shared.payAlertController(self, request: req, paySuccess: {
print("支付成功")
}, payFail: {
print("支付失败")
})
2.支付宝支付
///从服务器拿到生成好的请求参数
let orderString=json["charge"]["orderString"].stringValue
AliPayManager.shared.payAlertController(self, request:orderString, paySuccess: {
print("支付成功")
}, payFail: {
print("支付失败")
})

Swift调用微信支付宝SDK(Swift4.0)的更多相关文章

  1. 调用微信js sdk

    场景:需要调用微信获取当前位置的借口. 途径:查看微信 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 .后 ...

  2. 从支付宝SDK的支付流程理解什么是公钥和私钥,什么是加密和数字签名

    ------------------- 这是自己总结: 支付宝SDK支付用到的公钥与私钥整理如下: 1.商户应用公钥    2.商户应用私钥 3.支付宝公钥 4.支付宝私钥   商户应用的公钥与私钥生 ...

  3. 免sdk实现微信/支付宝转账打赏功能

    版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/162 近期发现了一个很好的开源项目,可以给自己的app添加 ...

  4. 支付宝支付 微信支付SDK接口不统一? 盘他!

      开发过支付宝.微信支付的同学都知道,微信的支付 API 设计感觉是 Java 开发工程师写的,远不如支付宝 SDK 的接口设计用起来顺手.在这里,统一封装微信支付和支付宝支付的API,使两种支付方 ...

  5. 解决微信官方SDK给出1.4.0等版本没有预览文件(previewFile)等接口

    使用苹果手机测试 调用微信的js-sdk在系统中实现上传.预览附件的功能.在自己的手机测试通过后,直接丢给QA测试了 本以为相安无事了,没想到QA用安卓手机测的时候居然不得,使用的是下载下来的jwei ...

  6. 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

    原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...

  7. 调用支付宝SDK问题

    近期做了一个项目里面要有支付.银联.支付宝,微信支付 我先一个一个写吧 先说支付宝SDK 支付宝SDK放进project里面之后肯定会报错.这时候你就要一个一个改掉 1. 2. 3. 哎 我懒得写了. ...

  8. React Native之支付集成(微信 支付宝)(ios android)

    React Native之支付集成(微信 支付宝)(ios android) 一,需求分析 1.1,app在线充值与提现 二,技术介绍与集成 2.1,微信支付 2.1.1,Android配置 详细配置 ...

  9. app微信支付宝支付后台的插件模式+回调通过spring广播处理后续业务(已亲测可用)

    写在前面的话:每当我们做一个项目,基本上都会涉及到支付的业务,最常用的莫过于微信和支付宝的支付了,项目有bug,有问题,都不叫问题,可一旦钱出了问题,那就是大问题了,所以在支付业务上我们必须慎之又慎! ...

随机推荐

  1. Qt编写自定义控件14-环形进度条

    前言 环形进度条,用来展示当前进度,为了满足大屏UI的需要特意定制,以前有个叫圆环进度条,不能满足项目需要,只能重新定做,以前的进度间距不能自适应分辨率,而且当前进度对应的反的进度不能单独设置颜色,即 ...

  2. Hibernate 的一些注解配置

    网上参考资料很多,但总是不符合自身习惯,遂记录下来. 一对多的关系 如class与student的关系 class中 @OneToMany(mappedBy = "class") ...

  3. MySQL数据库的库表迁移

    最近在研究MySQL数据库的库表迁移问题,主要分为两种情况,一种情况是迁移数据库的表的全部字段,另一种是迁移数据库的表的部分字段.前一种情况是直接使用mysqldump命令来实现,后一种情况则是采用数 ...

  4. React Native的生命周期

    就像 iOS开发中 一样,React Native(RN) 中的组件也有生命周期(Lifecycle).所谓生命周期,就是一个对象从开始生成到最后消亡所经历的状态,理解生命周期,是合理开发的关键.RN ...

  5. 软件开发的SOLID原则

    再次回顾以前潘加宇老师将的软件开放的原则. SOLID: 单一责任原则 S 开放封闭原则 O 里氏代换原则 L 接口分离原则 I 依赖反转原则 D 所有编程都是维护编程,因为你很少写原创代码.只有你在 ...

  6. HTML5元素周期表

    HTML5元素周期表 根元素 1. html 文档根元素 元数据和脚本 1. head HTML文档中的第一个元素.包含文档元数据 2. title 文档标题 3. meta 文档的元数据. meta ...

  7. C语言递归之二叉树的最大深度

    题目描述 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例 给定二叉树 [3,9,20,null,null,15 ...

  8. 【Python】【demo实验7】【练习实例】【完全平方数相关】

    题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...

  9. Springmvc使用注解实现执行定时任务(定时器)

    1.在Spring配置文件中添加 <task:annotation-driven/> 2.在需要调用执行定时任务的类中使用注解 @Service @Lazy(false) //避免spri ...

  10. PAT A1031 Hello World for U (20)

    思路: 读取数组 int i = 0; while(cin >> word) { c[i] = word; i++; } 计算边长 int n1 = (length + 2) / 3; i ...