iOS开发微信支付的介绍与实现
1、前期准备
- 到微信开放平台注册账号

- 需要登录邮箱验证

- 填写您的商户信息

- 到微信开放平台注册账号
- 进入管理中心 --- 移动应用 --- 创建移动应用 --- 根据页面完善应用资料
- 审核过后,通过应用详情页面,查看应用详情,查看AppID和AppSecret相关信息
- 创建这些是没有支付能力的,需要额外申请,还是根据提示一步步填写,填写完之后会发一封邮件到您的预留的邮箱,然后到商户平台点击打开链接填写资料,最主要的是验证下开户收款账号,会收到一波几分钱的巨额财产,那么这个时候如果你填写的是你的开户账号,直接跑路吧,这些钱够你在深圳买房了。。。。。。如果你是个好人,那么找你们财务验证下是否有收到,就代表通过了,愉快的代码时间来了.
2、实现过程
- 步骤1:
- 用户在商户APP中选择商品,提交订单,选择微信支付。
- 步骤2:
- 商户后台收到用户支付单,调用微信支付统一下单接口。
- 步骤3:
- 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
- 步骤4:
- 商户APP调起微信支付。
- 步骤5:
- 商户后台接收支付通知。
- 步骤6:
- 商户后台查询支付结果。
3、代码部分
- 代码地址
3.1 工程配置
- SDK接入

- 依赖库导入

- 配置下Scheme(这填写的是从微信申请回来的ID)

- SDK接入
3.2 代码实现
①向微信注册你的AppID
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self addAppKeyWindow];
// 注册APP,这里的字符串就是Wechat URL Scheme里面对应的ID 也是申请回来的ID,必须一致
[WXApi registerApp:@"wxb4ba3c02aa476ea1" enableMTA:NO]; return YES;
}
②请求服务器的参数,拉起微信支付App
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[super touchesBegan:touches withEvent:event]; // 调起微信支付
PayReq *req = [[PayReq alloc] init]; req.partnerId = @"1900006771";
req.prepayId = @"wx14215832306243f22c2cb64d1193213932";
req.nonceStr = @"25e0c43f7a5a8f743bdb818a72799396";
req.timeStamp = 1579010312;
req.package = @"Sign=WXPay";
req.sign = @"2C1EEC439D493D7936F292AFDFFA244D";
[WXApi sendReq:req];
}
- 这里请求的方法和步骤就不写了,无非就是post信息给服务器,咱们看看需要的数据格式(假数据)
- 以下数据是你自己商户后台请求处理返回的结果
{
"appid" : "wxb4b",微信开放平台审核通过的AppID
"noncestr" : "171127dd056d05e423c8b9e",随机字符串
"package" : "Sign=WXPay", 固定值
"partnerid" : "130", 微信支付分配的商户ID
"prepayid" : "wx201609291601", 预支付交易会话ID
"sign" : "684371081C049B6017641", 签名,除了sign,剩下6个组合的再次签名字符串
"timestamp" : 147513 当前时间
}
③处理回调信息
- (BOOL)application:(UIApplication *)application
openURL:(nonnull NSURL *)url
options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
return [WXApi handleOpenURL:url delegate:[CHWXApiManager sharedManager]];
}
- 这里的处理是根据微信官网提供的方法,代理到专门处理的单利当中去统一处理WXApiManager
- 注意:这里的支付结果是支付完成时回调过来的,这是不准确的,是否支付成功要根据自己后台返回的结果。
#import "CHWXApiManager.h" @implementation CHWXApiManager + (instancetype)sharedManager {
static dispatch_once_t onceToken;
static CHWXApiManager *instance;
dispatch_once(&onceToken, ^{
instance = [[CHWXApiManager alloc] init];
});
return instance;
} #pragma mark - WXApiDelegate
/*! @brief 发送一个sendReq后,收到微信的回应
*
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
* @param resp 具体的回应内容,是自动释放的
*/
- (void)onResp:(BaseResp *)resp {
if([resp isKindOfClass:[PayResp class]]) {
// 支付返回结果,实际支付结果需要去微信服务器端查询
NSString *strMsg, *strTitle = [NSString stringWithFormat:@"支付结果"]; switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付结果:成功!";
NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
break; default:
strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle
message:strMsg
delegate:self
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
[alert show];
}
else {
}
} /*! @brief 收到一个来自微信的请求,第三方应用程序处理完后调用sendResp向微信发送结果
*
* 收到一个来自微信的请求,异步处理完成后必须调用sendResp发送处理结果给微信。
* 可能收到的请求有GetMessageFromWXReq、ShowMessageFromWXReq等。
* @param req 具体请求内容,是自动释放的
*/
- (void)onReq:(BaseReq *)req { } @end
4、需要注意的问题
- ①App Scheme一定要配置正确
- ②千万不能用生成预订单返回的Sign,要重新生成(和后台沟通)
- ③要考虑拉起App支付的时候自己程序被退出或者自杀了
- ④一定不能用异步返回给App的参数进行判断成功与否,需要和后台进行二次确认,异步返回给后台的数据才是最终的
5、常见问题及解决办法
- 微信支付接入报错 +[WXOMTAHelper GUnzip:Out:] in libWeChatSDK.a(MTAHelper.o)
- 微信支付接入报错 +[WeChatApiUtil EncodeBase64:] in libWeChatSDK.a(WeChatApiUtil.o)
- 微信支付接入报错-[__NSArrayM enqueue:]: unrecognized selector sent to instance 0x28372d950
iOS开发微信支付的介绍与实现的更多相关文章
- IOS开发--微信支付
前言:下面介绍微信支付的开发流程的细节,图文并茂,你可以按照我的随笔流程过一遍代码.包你也学会了微信支付.而且支付也是面试常问的内容. 正文: 1.首先在开始使用微信支付之前,有一些东西是开发者必须要 ...
- iOS开发微信支付
现在基本所有的App都会接入支付宝支付以及微信支付,也有很多第三方提供给你 SDK帮你接入,但是这种涉及到支付的东西还是自己服务器搞来的好一些,其实搞懂了 逻辑非常的简单,下面直接给大家说说下基本流程 ...
- IOS开发--支付宝支付
前言:继上次<IOS开发--微信支付>以来,一直没有太多时间,更新总结详细支付这样的长篇大论,很抱歉.今天,推出支付宝支付的详细流程. 1.开始下载和查看支付宝支付的Demo. 我们直接进 ...
- IOS开发之支付功能概述
前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微 ...
- iOS开发网络篇—简单介绍ASI框架的使用
iOS开发网络篇—简单介绍ASI框架的使用 说明:本文主要介绍网络编程中常用框架ASI的简单使用. 一.ASI简单介绍 ASI:全称是ASIHTTPRequest,外号“HTTP终结者”,功能十分强大 ...
- iOS开发UI篇—简单介绍静态单元格的使用
iOS开发UI篇—简单介绍静态单元格的使用 一.实现效果与说明 说明:观察上面的展示效果,可以发现整个界面是由一个tableview来展示的,上面的数据都是固定的,且几乎不会改变. 要完成上面的效果, ...
- iOS开发多线程篇—GCD介绍
iOS开发多线程篇—GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 G ...
- iOS开发Swift篇—简单介绍
iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...
- Android开发 --微信支付开发(转载!)(开发工具:Eclipse)
Android_APP 微信支付接口开发 日期:2015-10-06 12:47:33 作者: 来源: 人气:3549 1.首先说一下我们在开发微信支付接口的时候遇到最多和最疑惑的问题,那就是明明 a ...
随机推荐
- Flutter中的Stack、Align、Positioned的使用
import 'package:flutter/material.dart'; import 'package:flutter_testdemo001/res/listData.dart'; void ...
- 报错:(未解决)java.lang.VerifyError: Instruction type does not match stack map
报错背景: CDH中集成kafka的服务,解决完kafka的jar包报错之后重启,发现这个报错. 报错现象: java.lang.VerifyError: Instruction type does ...
- JS语言中的JSON.parse()和JSON.stringify()
parse()用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":& ...
- LeetCode_401. Binary Watch
401. Binary Watch Easy A binary watch has 4 LEDs on the top which represent the hours (0-11), and th ...
- Beta冲刺(1/4)
队名:秃头小队 组长博客 作业博客 组长徐俊杰 过去两天完成的任务:学习了很多东西 Github签入记录 接下来的计划:继续学习 还剩下哪些任务:后端部分 燃尽图 遇到的困难:自己太菜了 收获和疑问: ...
- mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)
mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)当mysql断开连接 $_instance这个还是有值得 所以会报错 MySQL server has gone away 这个地方需要 ...
- Anaconda是什么?Anconda下载安装教程(1)
一.如果从事Python开发,配置环境需要安装两个包: 第一个安装开发工具,俗称IDE : 推荐使用 Pycharm 第二个安装开发工具包: Anaconda ps:Windows 下 Pycharm ...
- linux c基础技巧
C语言:向文件末尾进行追加数据https://blog.csdn.net/qq_31243065/article/details/82354557 https://zhidao.baidu.com/q ...
- ubuntu 安装 iperf
iperf的github https://github.com/esnet/iperf/releases 解压 sudo tar -zvxf iperf-3.6.tar.gz -C /usr/loca ...
- 修改Linux服务器中的MySql密码
1.可以直接在数据库中修改,因为知道root密码,所以直接登录 mysql -uroot -p 2.查看一下数据库,修改root密码需要使用如下图所示的mysql数据库 3.通过use mysql指明 ...