<html>
在iOS开发中,经常会涉及到支付功能,这里对常见的微信支付做一下详细说明
1. 微信支付
1.1 微信开放平台账号的注冊
微信开放平台(微信支付须要付费的。注冊成功后使用的主要为AppKey/SecretKey,当中SecrectKey交由后台完毕集成)
微信开放平台是商户APP接入微信支付开放接口的申请入口。通过此平台可申请微信APP支付。
平台入口:http://open.weixin.qq.com。
1.2 项目的改动与设置
1)首先应该下载SDK并导入项目(这里以友盟自带微信支付说明,详细内容类似)
假设项目中使用了友盟社会化分享SDK,那么你将不须要反复导入SDK,友盟中已经集成了微信支付。详细SDK例如以下:
假设你的项目没有使用友盟。请到开放平台下载最新的SDK,然后倒入您的项目。详细的SDK例如以下:
2)在加入完SDK后须要加入相应的库以及文件
3)然后是加入相应的url用于调起
4) 加入白名单、关闭Bitcode(对于http/https适配iOS9.0自行改动)
1.3 SDK的注冊与回调
在完毕了上面的操作之后,我们所导入的SDK就能够使用了,非常easy
1) 首先我们要进行注冊
导入#import “WXApi.h”
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
ViewController *userGuideViewController = [[ViewController alloc] init];
self.window.rootViewController = userGuideViewController;
[WXApi registerApp:@"这里加入APPKey"];
return YES;
}
2)接着我们要写一个调起
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
// 跳转到URL scheme中配置的地址
//NSLog(@"跳转到URL scheme中配置的地址-->%@",url);
return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
}
3)然后是回调
//支付成功时调用,回到第三方应用中
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
// NSLog(@"****************url.host -- %@",url.host);
if ([url.scheme isEqualToString:@"这里加入AppKey"])
{
return [WXApi handleOpenURL:url delegate:(id<WXApiDelegate>)self];
}
return YES;
}
- (void) onResp:(BaseResp*)resp
{
NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
NSString *strTitle = @"支付结果";
if([resp isKindOfClass:[PayResp class]]){
switch (resp.errCode) {
case WXSuccess:
strMsg = @"支付结果:成功!";
break;
case WXErrCodeUserCancel:
strMsg = @"支付结果:用户点击取消!
";
break;
case WXErrCodeSentFail:
strMsg = @"支付结果:发送失败。";
break;
case WXErrCodeAuthDeny:
strMsg = @"支付结果:授权失败。";
break;
default:
strMsg = @"支付结果:微信不支持!";
break;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alert show];
}
}
1.4 SDK的使用
1) 最后是在项目中须要进行微信支付的地方使用支付(这是完毕整个支付流程中最重要的一部分,也是最须要注意的地方)
首先要进行一次网络请求。后台接口,将你的商品信息发送到后台,生成订单后返回。返回信息中最少要包括六个參数,通过这些參数调起支付。
导入#import “WXApi.h”
//返回參数调起支付
PayReq* req = [[PayReq alloc] init];
NSMutableDictionary *dict=[result objectForKey:@"resultCode"];
req.openID = [dict objectForKey:@"appid"];
req.partnerId = [dict objectForKey:@"mch_id"];
req.prepayId = [dict objectForKey:@"prepay_id"];
req.nonceStr = [self md5:time_stamp];
req.timeStamp = [time_stamp intValue];
req.package = @"Sign=WXpay";
//签名(这个签名能够自己进行签名,也能够后台操作,由后台返回)
NSMutableDictionary *signParams=[[NSMutableDictionary alloc] init];
[signParams setObject: req.openID forKey:@"appid"];
[signParams setObject: req.nonceStr forKey:@"noncestr"];
[signParams setObject: req.package forKey:@"package"];
[signParams setObject: req.partnerId forKey:@"partnerid"];
[signParams setObject: time_stamp forKey:@"timestamp"];
[signParams setObject: req.prepayId forKey:@"prepayid"];
req.sign = [self createMd5Sign:signParams];
//调起支付(**參数有一个错误,将不能完毕调起**)
[WXApi sendReq:req];
2) 自行加密处理(这部分能够由后台完毕)
//微信支付加密
-(NSString *) md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char digest[CC_MD5_DIGEST_LENGTH];
CC_MD5( cStr, (unsigned int)strlen(cStr), digest );
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
[output appendFormat:@"%02X", digest[i]];
return output;
}
-(NSString*) createMd5Sign:(NSMutableDictionary*)dict
{
NSMutableString *contentString =[NSMutableString string];
NSArray *keys = [dict allKeys];
//按字母顺序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
//拼接字符串
for (NSString *categoryId in sortedArray) {
if (![[dict objectForKey:categoryId] isEqualToString:@""]
&& ![categoryId isEqualToString:@"sign"]
&& ![categoryId isEqualToString:@"key"]
)
{
[contentString appendFormat:@"%@=%@&", categoryId, [dict objectForKey:categoryId]];
}
}
//加入key字段
[contentString appendFormat:@"key=%@", @"这里加入SecretKey"];
NSString *md5Sign =[WXUtil md5:contentString];
return md5Sign;
}
1.5常见异常Bug处理
1) 常见问题为微信支付调起不成功,每次调起仅仅能调起一个带有你返回确认button的页面。
原因:參数错误。特别注意參数(签名)。后台的返回的參数不对。
解决方式:逐个校验參数。签名能够本地加密处理,不要依赖后台的返回签名。有的时候后台返回的是不对的。
举报
- 本文已收录于下面专栏:
相关文章推荐
-
【iOS】原生微信登录和分享
年前的时候。公司说须要在APP里面做微信、新浪和QQ的第三方登录。当时,因为APP已经集成了微信支付、微信、新浪和QQ的分享ShareSDK(精简版)。后来在集成微信、新浪和QQ的第三方登陆地时候,S...- zhuming3834
- 2016-03-22 20:17
- 4188
-
ios 应用内跳转微信
寻常我们做iOS开发,会常常遇到打开其它的APP的功能。本篇文章讲的就是打开别人的APP的一些知识。我们的目标是: 打开别人的APP让别人打开我们的APPiOS9的适配问题使用URL Schemes...
- TianYou_Code
- 2016-09-06 10:23
- 3617
-
iOS接入微信支付(小白都能看懂的微信支付)
由于最近项目中须要接入微信支付功能,自己也爬了非常多的坑,所以做了一下这边文章供大家学习參考。远离爬坑,文章主要讲到下面五部分: 一、 填写商户平台所需资料 填写商户平台所需资料 一、填写经营信息...- hotdog12345a
- 2016-10-08 13:37
- 6199
-
iOS-支付宝&微信支付
一. 微信支付 1.所须要的材料 微信SDK 微信SDK在微信开放平台上面申请得到的參数 // 应用的APPID kWXAppID @"wxc82cXXXXXXXX" //...- u011452278
- 2017-06-02 18:00
- 562
-
iOS中 最新微信支付/最全的微信支付教程具体解释 韩俊强的博客
亲们, 首先让我们来看一下微信支付的流程吧. 1. 注冊微信开放平台。创建应用获取appid,appSecret。申请支付功能。申请成功之后会返回一些參数. 2. 下载微信支付sdk 3. 客户...- qq_31810357
- 2016-04-15 18:00
- 11567
-
iOS-微信支付总结
前言:在iOS开发中。经常会涉及到支付功能,而微信支付是不可缺少的,这里笔者就简单整理了一下微信支付的流程。即使分享也是对自己学习的总结。一. 微信集成的基本流程(所需资料由公司提供)微信商户申请步骤...
- Scorpio_27
- 2016-09-12 17:09
- 936
-
iOS微信支付接入
如今基本全部的App都会接入支付宝支付以及微信支付。也有非常多第三方提供给你 SDK帮你接入,可是这样的涉及到支付的东西还是自己server搞来的好一些,事实上搞懂了 逻辑很的简单,以下直接给大...- sheng_bin
- 2017-05-14 22:13
- 286
-
iOS微信支付开发
第一次集成微信支付出现了非常多问题,当然微信支付假设是后台返回二次签名数据,这样做的话。就简单非常多了,本文主要集中解说的是微信支付怎样在本地生成预支付订单,以及预支付订单的二次签名(ps.第一次写这种...- lixingqiao01
- 2015-12-23 17:22
- 889
-
[iOS]关于微信支付
一,前期准备: 1.到微信的开放平台注冊账号:https://open.weixin.qq.com 2.进入管理中心--->移动应用--->创建移动应用:依据提示完好应用资料 3.审核通过后,...- lqq200912408
- 2016-02-29 22:21
- 3629
-
iOS开发支付集成之微信支付
微信支付也是须要签名的,也跟支付宝一样,能够在client签名,也能够在后台签名(当然,为了安全还是推荐在server上做签名,逻辑也比較好理解)。 集成前首先要看看文档 ...- qq_34047841
- 2016-07-13 09:47
- 574
2条评论