ios应用内支付关闭什么意思

iOS实现微信支付流程详解
作者:Meng锋
字体:[ ] 类型:转载 时间:
本篇文章主要介绍了iOS实现微信支付流程详解 ,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
自微信支付、支付宝支付入世以来,移动端的支付日渐火热。虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握。从难易程度上讲,不管是微信支付还是支付宝支付都是非常简单的,因为第三方的支付文档非常详细,而且他们内部的安全性也非常高。作为使用这些支付策略的我们,只需要掌握流程,能够实现正常支付的功能即可。为什么要写下这篇博文,原因有二。其一,微信支付流程中有坑,其二,以后忘记了可以拿出来看看。
1.微信支付需要两个账号,财付通和微信开发者,注册完成后需要开通支付功能,这些流程就不用多说了。在所有申请成功后,我们要取出我们支付功能需要的key:
appID、app密钥(微信发给你的邮件中有如何生成密钥的链接)、商户号。
2.在Xcode中配置app ID,需要设置下白名单,在url中配置app ID,不清楚的童鞋可以百度一下。
从此处开始,进入本次的主题,开始支付。支付的过程且分为四个步骤:
第一步& 获取订单号
获取订单号的途径可以是客户端自己生成,也可以去服务器生成,不过一般都是服务器生成。假设拿到了订单号设为order_no。
第二步& 统一下单
这个过程是非常关键的一步,也是坑常驻的一步。统一下单有的人做法是在服务器操作,有的在客户端,不管在哪下单都是有必要搞懂的。接下来看看统一下单必须要的参数列表:
/*应用ID 微信开放平台审核通过的应用app ID*/
@property (nonatomic, copy) NSString *
/*商户号 微信支付分配的商户号*/
@property (nonatomic, copy) NSString *mch_
/*随机字符串 随机字符串,不长于32位*/
@property (nonatomic, copy) NSString *nonce_
@property (nonatomic, copy) NSString *
/*商品描述 天天爱消除-游戏充值。*/
@property (nonatomic, copy) NSString *
/*商户订单号*/
@property (nonatomic, copy) NSString *out_trade_
/*总金额 订单总金额,单位为分*/
@property (nonatomic, copy) NSString *total_
/*终端IP*/
@property (nonatomic, copy) NSString *spbill_create_
/*通知地址*/
@property (nonatomic, copy) NSString *notify_
/*交易类型*/
@property (nonatomic, copy) NSString *trade_
其中,sign是其他所有参数按照key1=value1&key2=value2...的方式拼接,然后进行加密得到。参数拼接按照字母排序,举个例子,参数为appid=@"id",mch_id=@"mch"得到的字符串应该是:@"appid=id&mch_id=mch",然后对该字符串进行加密,如下述代码
- (instancetype)initWithDicInfo:(NSDictionary *)infoDic{
if (self = [super init]) {
self.appid = WECHAT_SHARE_APPID;
self.mch_id = WECHAT_MCH_ID;
self.nonce_str = [AppMethod getRandomString];
self.body = @"test";
self.out_trade_no = [infoDic formateObjectForKey:@"order_no"];
self.total_fee = [NSString stringWithFormat:@"%@", [infoDic formateObjectForKey:@"amount"]];
self.spbill_create_ip = [AppMethod deviceIPAdress];
self.notify_url = [NSString stringWithFormat:@"%@%@", BASE_URL, WECHAT_NOTI_URL];
self.trade_type = @"APP";
self.payDic = [NSMutableDictionary dictionary];
[self.payDic setValue:self.appid forKey:@"appid"];
[self.payDic setValue:self.mch_id forKey:@"mch_id"];
[self.payDic setValue:self.nonce_str forKey:@"nonce_str"];
[self.payDic setValue:self.body forKey:@"body"];
[self.payDic setValue:self.out_trade_no forKey:@"out_trade_no"];
[self.payDic setValue:self.total_fee forKey:@"total_fee"];
[self.payDic setValue:self.spbill_create_ip forKey:@"spbill_create_ip"];
[self.payDic setValue:self.notify_url forKey:@"notify_url"];
[self.payDic setValue:self.trade_type forKey:@"trade_type"];
self.sign = [self partnerSignOrder:self.payDic];
[self.payDic setValue:self.sign forKey:@"sign"];
- (NSString *)partnerSignOrder:(NSDictionary*)paramDic{
NSArray *keyArray = [paramDic allKeys];
NSMutableArray *sortedKeyArray = [NSMutableArray arrayWithArray:keyArray];
[sortedKeyArray sortUsingComparator:^NSComparisonResult(NSString* key1, NSString* key2) {
return [key1 compare:key2];
NSMutableString *paramString = [NSMutableString stringWithString:@""];
// 拼接成 A=B&X=Y
for (NSString *key in sortedKeyArray){
if ([paramDic[key] length] != 0){
[paramString appendFormat:@"&%@=%@", key, paramDic[key]];
if ([paramString length] & 1){
[paramString deleteCharactersInRange:NSMakeRange(0, 1)];
// remove first '&'
[paramString appendFormat:@"&key=%@", WeChatPARTNER_ID];//app密钥
return [[AppMethod signString:paramString] uppercaseString];
AppMethod.m
+ (NSString *)signString:(NSString*)origString{
const char *original_str = [origString UTF8String];
unsigned char result[32];
CC_MD5(original_str, (CC_LONG)strlen(original_str), result);//调用md5
NSMutableString *hash = [NSMutableString string];
for (int i = 0; i & 16; i++){
[hash appendFormat:@"%02X", result[i]];
这样,统一下单的参数已经准备好了,下面开始请求微信的下单接口:,现在坑又来了。按照微信的下单说明,传给微信服务器的参数必须是XML格式的数据。如果你传过这种类型的自然好办,不过我猜大多数童鞋没有传过这种类型的数据,好在AF有提供方法,不然就等着哭吧。继续看代码
+ (void)postWechatPayWithUrl:(NSString *)url
params:(id)params
andSuccess:(requestSuccessResult)successBlock
andFailure:(requestFailureResult)failureBlock{
NSString *string = [params XMLString];//这里需要导入XMLDictionary文件,里面有该方法
AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
// 这里传入的XML字符串只是形似XML,但不是正确是XML格式,需要使用AF方法进行转义
session.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
[session.requestSerializer setValue:@"text/ charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[session.requestSerializer setValue:url forHTTPHeaderField:@"SOAPAction"];
[session.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
[session POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
successBlock(responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
HPError *hpError = [HPError errorWithCode:error.code desc:error.description];
failureBlock(hpError);
按照上述的步骤,到这里就可以正常下单了,如果微信服务器返回给你的数据中有"result_code" = SUCCESS; "return_code" = SUCCESS,说明下单成功,这个步骤也到此结束。
第三步& 调起微信客户端,并完成支付
如果第二步正常下单,那么微信会返回给你预支付ID,这个ID在最后的支付中至关重要,下面的代码是比较统一的,大家都这么写。
HPWechatProduct *product = [[HPWechatProduct alloc] initWithDic:result];
PayReq *req
= [[PayReq alloc] init];
req.partnerId
= product.
req.prepayId
= product.
req.nonceStr
= product.
req.timeStamp
= [product.timestamp intValue];
req.package
= product.
= product.
BOOL flag = [WXApi sendReq:req];
HPWechatProduct.m
- (instancetype)initWithDic:(NSDictionary *)dic{
if (self = [super init]) {
self.appid = WECHAT_SHARE_APPID;
self.partnerid = mah_
self.prepayid = [dic formateObjectForKey:@"prepay_id"];
self.package = @"Sign=WXPay";
self.noncestr = [AppMethod getRandomString];
self.timestamp = [self getTime];
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setValue:self.appid forKey:@"appid"];
[dic setValue:self.partnerid forKey:@"partnerid"];
[dic setValue:self.prepayid forKey:@"prepayid"];
[dic setValue:self.package forKey:@"package"];
[dic setValue:self.noncestr forKey:@"noncestr"];
[dic setValue:self.timestamp forKey:@"timestamp"];
self.sign = [self partnerSignOrder:dic];
- (NSString *)partnerSignOrder:(NSDictionary*)paramDic{
NSArray *keyArray = [paramDic allKeys];
NSMutableArray *sortedKeyArray = [NSMutableArray arrayWithArray:keyArray];
[sortedKeyArray sortUsingComparator:^NSComparisonResult(NSString* key1, NSString* key2) {
return [key1 compare:key2];
NSMutableString *paramString = [NSMutableString stringWithString:@""];
// 拼接成 A=B&X=Y
for (NSString *key in sortedKeyArray){
if ([paramDic[key] length] != 0){
[paramString appendFormat:@"&%@=%@", key, paramDic[key]];
if ([paramString length] & 1){
[paramString deleteCharactersInRange:NSMakeRange(0, 1)];
// remove first '&'
[paramString appendFormat:@"&key=%@", WeChatPARTNER_ID];
return [[AppMethod signString:paramString] uppercaseString];
- (NSString *)getTime{
NSTimeInterval interval = [[NSDate date] timeIntervalSince1970];
return [NSString stringWithFormat:@"%ld", (long)interval];
AppMethod.m
+ (NSString *)getRandomString
NSString *str = [NSString stringWithFormat:@"%s",genRandomString(32)];
如果到了这一步,而且跑到了微信并完成了支付,那么微信会有一个回调,告诉你支付成功了。然而真的成功了嘛,请继续看第四步。
第四步& 去服务器查询是否支付成功
即使微信告诉你支付成功了,你也不能相信,只有钱真正打到你们的账号里面了,才算支付成功。任何时候都不能以微信的回调的值判断支付是否成功(这是微信文档说的)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
现在apple pay发布了,是否可以用apple pay来完成IAP的支付,毕竟30%太扯了,大家给点建议。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
完全可以,IAP主要针对虚拟商品,实物或者其他已定价值的商品最好用其他方式进行支付,毕竟30%谁也承受不了。已经有很多App支持了Apple Pay,如美图等。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
apple pay 跟 IAP 不重叠吧~ 虚拟商品应该还是只能用 IAP,实体商品本来就可以用支付宝之类的,你在淘宝买东西不可能用 IAP 的。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
应该不行,官方文档说的不太明显
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
貌似是不可以的,IAP 和 Apple Pay两码事儿,苹果不会自缚手脚的
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:十周年苹果发布会,不知道这一次在发布会上又会出现什么惊奇的演示APP。
今年你最关心Apple Watch的哪一点更新呢?
OLED屏幕:买不到iPhone 8怪我咯,来打我啊!
这款概念 iPad 跟 iPhone 8 一样取消了实体 Home 键。
上个月,台积电使用 10nm 工艺生产的芯片占总营收的 10%。
负责生产 VCSEL 的 Finisar 一直被认为是苹果的供应商。
分析师认为,苹果公司可能会推出 iPhone 8 捆绑销售包。
苹果似乎正在加大对其智能扬声器 HomePod 的测试力度。
《王者荣耀》策划Donny表示,英雄的技能介绍将会大改,同时优化训练关卡,让玩家在初...
在一个不怎么新鲜的题材上做出了足够的诚意和细节,虽然同类游戏的选择太多显得该作不...
从 PC 端到移动端,我们最爱的三国志回来了。
在平面设计世界,汉字是人类社会有史以来最伟大最成功的设计。
已经改旗易帜的知名手机游戏厂商 Gameloft 最近又有了新的动作,他们在全球范围内推出...
原著小说千万销量,动漫班底声优献声,预约阶段场面火爆,网易游戏呕血自研!不得不说...
如今这个满眼都是“屠龙宝刀油腻师姐点击就送开局只有一条狗”的辣眼网络文案世界,《...
除了给 iPhone 提供续航,它还可以给 AirPods 充电。
被掐住了供应链的上游,“iPhone 8” 想要获得成功,苹果还得找到新的供应商伙伴。
新 MacBook Pro 设备端口向 USB-C 过渡,iPhone 7 取消了 3.5mm 耳机接口,然而 Beats...
好吧,它们可能看起来很奇怪,但无线耳机能否成为我们与电脑互动的关键方式呢?
DockCase 保护壳解决了 MacBook Pro 的最大难题。
这款产品让 iPhone 用户更容易备份文件以及扩大存储。
在某些情况下,通过无线进行文件传输的效率依然赶不上物理介质。
从规格来说,你觉得这款摄像头怎么样?
本主题需要才能查看,如没有账号,戳我!
威锋旗下产品
Hi~我是威威!
沪公网安备 29号 | 沪ICP备号-1
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!主题 : App的应用内支付能否改成其他支付方式支付?
级别: 新手上路
UID: 393101
可可豆: 61 CB
威望: 48 点
在线时间: 147(时)
发自: Web Page
来源于&&分类
App的应用内支付能否改成其他支付方式支付?&&&
App有一个功能要收费,能否不用应用内支付而改为其他支付方式呢?
级别: 圣骑士
UID: 335418
可可豆: 1733 CB
威望: 1418 点
在线时间: 1303(时)
发自: Web Page
支付宝&&微信支付&&银联&&
级别: 新手上路
UID: 393101
可可豆: 61 CB
威望: 48 点
在线时间: 147(时)
发自: Web Page
回 1楼(woshiumo12) 的帖子
那应用内支付有什么意义?公司开发一个app谁还用应用内支付?直接调用其他支付方式多好?干嘛还给苹果公司收取利息?
级别: 精灵王
UID: 140609
发帖: 1040
可可豆: 1259 CB
威望: 1257 点
在线时间: 2551(时)
发自: Web Page
回 2楼(暮雨洒江天) 的帖子
苹果有规定的,比如说游戏币或者钻石爱心什么的,这些虚拟物品就需要应用内支付,不能走其他流程
级别: 圣骑士
UID: 335418
可可豆: 1733 CB
威望: 1418 点
在线时间: 1303(时)
发自: Web Page
回 3楼(kaka_007) 的帖子
游戏就不知道了。
级别: 侠客
UID: 462955
可可豆: 304 CB
威望: 302 点
在线时间: 437(时)
发自: Web Page
一些虚拟的东西,如果用 支付宝 微信支付,苹果会拒绝你上架的
级别: 新手上路
可可豆: 5 CB
威望: 5 点
在线时间: 70(时)
发自: Web Page
回 5楼(ccloveiOS) 的帖子
你可以审核阶段,先将支付功能隐藏,等上架后再显示支付功能
级别: 新手上路
UID: 393101
可可豆: 61 CB
威望: 48 点
在线时间: 147(时)
发自: Web Page
回 5楼(ccloveiOS) 的帖子
如果是App里面一个特殊的功能,能否不用应用内支付啊?
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,投稿&纠错等事宜请致邮
你只管努力,剩下的交给时光!
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:。个人QQ群:、
个人大数据技术博客:
iOS应用内支付解决方案

我要回帖

更多关于 ios支付如何扣款 的文章

 

随机推荐