1. 介绍

本文为以前做的项目总结,由于相关支付 SDK 迭代,原文已经不满足需求,故作如下更新,供大家参考,另外增加常见问题总结

项目中要用到支付功能,需要支付宝支付、微信支付、银联支付、Apple_pay,所以打算总结一下,方便以后的查阅,也方便大家, 用到的地方避免再次被坑。

今天我们就主要介绍一下微信支付,其他支付介绍后面会尽快更新出来。

集成前首先要看看文档,微信支付开发文档里面有详细的字段和说明。
微信支付是需要签名的,跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)

源码获取

关注公众号「网罗开发」回复“支付宝支付”即可领取

加微信:FBY-fan 领 45 本电子书

2. 业务流程

以下是交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成。

商户系统和微信支付系统主要交互说明:

    1. 用户在商户APP中选择商品,提交订单,选择微信支付。
    1. 商户后台收到用户支付单,调用微信支付统一下单接口。
    1. 统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。
    1. 商户APP调起微信支付。
    1. 商户后台接收支付通知。
    1. 商户后台查询支付结果。

3. 下载微信SDK

如果集成了友盟分享里的微信,那就不用下载,也不用配置环境,因为配置友盟分享的时候已经把微信支付的环境都配置好了(包括框架,schema跳转,白名单)如果没有集成过友盟分享那么请到微信开放平台下载SDK。

建议把iOS头文件和支付示例都下载下来

4. 导入库集成 SDK

4.1 导入 SDK 库

导入上面那个iOS头文件和库下载下载出来的SDK包的就行,然后需要链接上依赖库,在Target —> BuildPhases —> Link Binary With Libraries— 点击+号 -> 搜索你需要的系统库。

  • SystemConfiguration.framework
  • libz.tbd
  • libsqlite3.0.tbd
  • CoreTelephony.framework
  • QuartzCore.framework

4.2 设置URL Scheme

商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID,在APP端开发步骤里面说得很清楚了,需要填在URL Schemes这个地方。

4.3 在Appdelegate中注册APPID

首先要在Appdelegate中引用头文件

//微信支付
#import "WXApi.h"

然后注册APPID

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//    向微信终端注册ID[WXApi registerApp:@"wxd930ea5d5a258f4f"];return YES;
}

在支付成功之后,支付结果返回,需要获取url,也需要在Appdelegate中完成,代码如下:

- (BOOL)application:(UIApplication *)applicationopenURL:(NSURL *)urlsourceApplication:(NSString *)sourceApplicationannotation:(id)annotation {if ([url.host isEqualToString:@"safepay"]) {//跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}];}else if ([url.host isEqualToString:@"pay"]) {// 处理微信的支付结果[WXApi handleOpenURL:url delegate:self];}return YES;
}// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{if ([url.host isEqualToString:@"safepay"]) {//跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}];}else if ([url.host isEqualToString:@"pay"]) {// 处理微信的支付结果[WXApi handleOpenURL:url delegate:self];}return YES;
}

微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的:

-(void) onResp:(BaseResp*)resp
{//启动微信支付的responseNSString *payResoult = [NSString stringWithFormat:@"errcode:%d", resp.errCode];if([resp isKindOfClass:[PayResp class]]){//支付返回结果,实际支付结果需要去微信服务器端查询switch (resp.errCode) {case 0:payResoult = @"支付结果:成功!";break;case -1:payResoult = @"支付结果:失败!";break;case -2:payResoult = @"用户已经退出支付!";break;default:payResoult = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];break;}}
}

4.4 调用支付接口

在调用微信支付类里面,首先增加头文件引用。

#import "WXApi.h"

在调起支付的方法中,需要上传的参数包括:appid、partid(商户号)、prepayid(预支付订单ID)、noncestr(参与签名的随机字符串)、timestamp(参与签名的时间戳)、sign(签名字符串)这六个。
在点击支付的控制器中使用核心代码来调起微信客户端支付,这些个参数都是后台传给你的。 加上了注释,应该很好理解的。代码如下:

#pragma mark 微信支付方法
- (void)WechatPay{//需要创建这个支付对象PayReq *req   = [[PayReq alloc] init];//由用户微信号和AppID组成的唯一标识,用于校验微信用户req.openID = appid;// 商家id,在注册的时候给的req.partnerId = partnerid;// 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你req.prepayId  = prepayid;// 根据财付通文档填写的数据和签名req.package  = package;// 随机编码,为了防止重复的,在后台生成req.nonceStr  = noncestr;// 这个是时间戳,也是在后台生成的,为了验证支付的NSString * stamp = timestamp;req.timeStamp = stamp.intValue;// 这个签名也是后台做的req.sign = sign;//发送请求到微信,等待微信返回onResp[WXApi sendReq:req];}

4.5 判断手机是否安装微信客户端

在需要微信支付的地方调用封装的类方法之后会跳转到微信app,如果没有安装则没有任何反应。这里需要注意,因为没有安装微信,必须要提供webview的方式登录微信来支付,否则苹果公司会拒绝应用上架。但是微信又不自带webview的方式,(支付宝是自带的)所以要判断用户有没有安装微信,如果没有安装微信就不显示微信支付这个按钮。

// 判断手机有没有微信if ([WXApi isWXAppInstalled]) {wechatButton.hidden = NO;}else{wechatButton.hidden = YES;}

到这里微信支付就基本完成了,如果小伙伴们在集成过程中遇到什么问题,可以留言给我或者添加qq,在线帮你解决。

5. 常见问题解决

5.1 支付后无法返回 App

如果支付完成后,一直留在微信,那就检查下URLType中的Scheme设置问题。

5.2 参数过期

能够打开微信客户端,但是打开后只有中间一个白色的 “确定按钮”,点击后会回到客户端上,如果是这样,那应该是prepayid 参数的问题,过期了,或者不是真实的id。

5.3 微信支付的单位是分

5.4 程序没有找到sdk库

工程->build setttings -> 搜索other linker flags 添加-Objc -all_load ,运行工程可能会崩溃,原因是程序没有找到sdk库。

5.5 白名单

不配置白名单也可以调起支付,如果调不起支付,查看是否是白名单的问题。

打开工程里的info.plist文件 添加LSApplicationQueriesSchemes数组并添加wechat 和 weixin字符串。

或者info.plist右键->source code打开添加下面这段代码

<key>LSApplicationQueriesSchemes</key>
<array><string>wechat</string><string>weixin </string>
</array>

5.6 中文名的工程报错

中文名的工程会报这个错误,英文名则不会,这是因为缺少UIKit库 在WXApiObject.h里导入库#import <UIKit/UIKit.h>。

5.7 找不到对应的编译包

微信 sdk 的问题,找不到对应的编译包,把 libc++ 这个导入就解决了

获取源码方式:关注「网罗开发」回复 “微信支付” 即可获取链接

iOS 微信支付开发(最新版)相关推荐

  1. iOS之“微信支付”开发流程

    实现微信支付的开发,iOS端里面只需要四个步骤: 向服务端请求预支付,获得prepayid以及noncestr: 把参数拼起来签名: 发起支付请求: 处理支付结果. iOS的微信SDK的接入:即为&q ...

  2. 微信支付开发(6) 收货地址共享接口

    关键字:微信支付 收货地址共享 作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/p/weixin-editAddress.html 请看新版教程  微信支付开发 ...

  3. 微信支付开发(6) 发货通知

    由于微信支付接口更新,本文档已过期,请查看新版微信支付教程.地址 http://www.cnblogs.com/txw1958/category/624506.html 本文介绍微信支付中发货通知功能 ...

  4. iOS微信支付的步骤以及问题描述

    本博客转自:http://www.jianshu.com/p/22a1ceee4d36 一.微信支付的步骤: 1.在微信开放平台注册.微信开放平台 2.创建一个App应用.(需要填写App的资料,审核 ...

  5. 微信服务号 微信支付开发

    微信支付,须要通过微信支付验证 眼下.支付仅限服务号, 做微信支付开发,主要看开发文档 统一下单. 订单查询 退款等 1.发起支付.都是通过h5发起的,首先获取prepay_id 发起支付,须要统一下 ...

  6. 微信支付通知 php,微信支付开发交易通知实例

    一.交易通知 用户在成功完成支付后,微信后台通知(POST)商户服务器(notify_url)支付结果.商户可以使用notify_url的通知结果进行个性化页面的展示. 对后台通知交互时,如果微信收到 ...

  7. 微信支付 php编程,PHP编程:微信支付开发交易通知实例

    <PHP编程:微信支付开发交易通知实例>要点: 本文介绍了PHP编程:微信支付开发交易通知实例,希望对您有用.如果有疑问,可以联系我们. 一.交易通知 用户在成功完成支付后,微信后台通知( ...

  8. java微信支付必要参数_微信支付 开发账号体系各参数详解

    商户在微信公众平台提交申请资料以及银行账户资料,资料审核通过并签约后,可以获得表6-4所示帐户(包含财付通的相关支付资金账户),用于公众帐号支付. 帐号及作用: appid :公众帐号身份的唯一标识. ...

  9. 微信支付开发准备工作和详细步骤

    微信支付前的准备工作 1 开发者资质认证 微信支付开发第一步就是使用公司管理者/高层帐号登录微信开放平台,进入"账号中心",进行开发者资质认证,需要填写公司资料,包括但不限于,公司 ...

  10. 工作笔记——微信支付开发相关知识整理

    在最近的工作中,引入了微信小程序支付,在开发过程中积累和整理了一些技术知识,现将其整理如下 目录 一.概念认识 (一)术语介绍 (二)名词解释 (四)对接微信支付接口规则整理 二.微信支付开发参考 ( ...

最新文章

  1. Spring MVC拦截器
  2. 牛津书虫系列双语读物
  3. 【Java】6.7 内部类
  4. 神策营销云:微信生态中,「电商」如何借“运营工具”,抢占 4.5 亿流量红利?...
  5. 如何以可视化方式显示 Angular 应用构建后的 bundle 文件大小
  6. SAP 电商云 Spartacus UI 模块延迟加载的入口程序
  7. adnroid string拼接_Android开发中string.xml文件中字符串的拼接
  8. Win7下的内置FTP组件的设置详解
  9. hadoop设置用户权限_No.9 MySQL之用户管理与权限设置
  10. bo dto java vo_Java 键对象 KO (key object) 介绍
  11. 通过静态发现方式部署 Etcd 集群
  12. 怎么用Excel来批量生成SQL语句
  13. 怎样查看sql服务器日志文件,怎么通过sql日志,查看以前执行过的sql语句
  14. Java生成随机数公式
  15. chloe.mysql_Chloe.ORM框架应用实践
  16. __attribute__((weak)) 简介及作用
  17. 2016年排名Top 100的Java类库——在分析了47,251个依赖之后得出的结论(16年文章)...
  18. SDSoC和SDAccel和SDNet和HLS工具介绍
  19. Tools/Profiler
  20. javaScript快速入门(笔记)

热门文章

  1. windows11常用快捷键
  2. windows10卸载程序_如何在Windows 10中卸载或修复程序
  3. python 实现复数计算器
  4. 使用了3年多的华硕笔记本电脑fl5900uq7500电脑感受-提示已接通电源、正在放电抓狂问题
  5. oracle rac告警,oracle11.2.0.4 RAC 日志总有告警
  6. 安装ie9提示未能完成安装_win10系统安装iE提示“internet Explorer未能完成安装”的方法介绍...
  7. 理解Tensorflow的shape
  8. HTML选择器的学习
  9. PTA题目 : 用指针实现将一个3*3的整型矩阵转置
  10. Windows电脑上搭建Radius 服务器并实现802.1X认证