iOS 微信支付总结

1.支付流程

https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3

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

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付。

步骤5:商户后台接收支付通知。

步骤6:商户后台查询支付结果。

2. 将微信支付的SDK塞进工程

3.配置info.plist

a.schemes

b.白名单

c.安全配置支持Http

4.配置路径

Library search Paths : $(PROJECT_DIR)/XWMerchant/ThirdParts/Wechat/SDKExport

5. 配置payRequsestHandler.h文件

#define APPP_ID         @""               //APPID

#define APP_SECRET      @"" //appsecret

//商户号,填写商户对应参数

#define MCH_ID          @""

//商户API密钥,填写相应参数为了MD5加密

#define PARTNER_ID      @""

//支付结果回调页面

#define NOTIFY_URL      @"http://wxpay.weixin.qq.com/pub_v2/pay/notify.v2.php"

//获取服务器端支付数据地址(商户自定义)

#define SP_URL          @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php"

6.支付

a.在

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中注册一下先:

if ([WXApi registerApp:APPP_ID withDescription:@"weixin"]){

DLog(@"注册成功");

}else{

DLog(@"注册失败");

}

b.在

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation代理中

if ([url.host isEqualToString:@"pay"]) {

[WXApi handleOpenURL:url delegate:self];

}支持回调

c.在需要支付的页面调用如下方法,记得包含头文件

#pragma mark   ==============微信支付==============

- (void) wechatPay:(NSDictionary *)dic{//目前只需要prepay_id
    NSLog(@"开始微信支付");

    //首先判断是否安装wechat

    if([WXApi isWXAppInstalled]){

        //生成订单

        NSLog(@"l-----:%@ ",dic);

        NSString *prePayid = dic[@"prepay_id"];

//        //获取到prepayid后进行第二次签名

        NSString    *package, *time_stamp, *nonce_str;
        //设置支付参数
        time_t now;
        time(&now);
        time_stamp  = [NSString stringWithFormat:@"%ld", now];
        nonce_str    = [WXUtil md5:time_stamp];
        //重新按提交格式组包,微信客户端暂只支持package=Sign=WXPay格式,须考虑升级后支持携带package具体参数的情况
        //package       = [NSString stringWithFormat:@"Sign=%@",package];
        package         = @"Sign=WXPay";
        //第二次签名参数列表
        NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
        [signParams setObject: APPP_ID        forKey:@"appid"];
        [signParams setObject: nonce_str    forKey:@"noncestr"];
        [signParams setObject: package      forKey:@"package"];
        [signParams setObject: MCH_ID        forKey:@"partnerid"];
        [signParams setObject: time_stamp   forKey:@"timestamp"];
        [signParams setObject: prePayid     forKey:@"prepayid"];
        //[signParams setObject: @"MD5"       forKey:@"signType"];
        //生成签名
        NSString *sign  = [self createMd5Sign:signParams];//获取微信预付款id
        if ( prePayid != nil && sign != nil) {//调起微信支付
            PayReq* req             = [[PayReq alloc] init];
            req.openID              = APPP_ID;//
            req.partnerId           = MCH_ID;//商户号
            req.prepayId            = prePayid;//预付订单号,后台返回的
            req.nonceStr            = nonce_str;//随机串            req.timeStamp           = time_stamp.intValue;//时间戳            req.package             = @"Sign=WXPay";//此地方一定要写成这种格式,后台生成预付订单时也是如此,不要写成prepay_id = @"wx...."
            req.sign                = sign;            BOOL sendRes = [WXApi sendReq:req];
            if (sendRes) {
                NSLog(@"唤起成功");
            }else {
                NSLog(@"唤起失败");

            }
            //日志输出
            DLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
        }else{
            DLog(@"预付订单生成失败");
            [XWPrompt showPromptMessage:@"订单失败"];
        }

    }else{

        [SMAlertView showAlertWithTitle:@"您还没有安装微信" message:@"是否安装?" cancelTitle:@"否" cancelTitleColor:colorForDeepGrayNormal otherTitle:@"是" otherTitleColor:colorForNavBgColor completion:^(BOOL cancelled) {

            if (!cancelled) {

                DLog(@"%d",cancelled);

                [[ UIApplication sharedApplication] openURL:[NSURL URLWithString:[WXApi getWXAppInstallUrl]]];

            }
        }];

    }
}

//创建package签名
-(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=%@", PARTNER_ID];
    //得到MD5 sign签名
    NSString *md5Sign =[WXUtil md5:contentString];

    return md5Sign;
}

基本上就能支付成功了,如不成功,请仔细检查一下plist文件的配置白名单,安全,sechems,路径,密钥PARTNER_ID,一定要二次签名,要不支付不成功,特别是唤起支付时[WXApi sendReq:req];总是不成功,而且后台生成预付订单时一定要package = @"Sign=WXPay" ,另一个最他妈坑的就是一定不要用shareSDK,它里面的微信分享的包和微信支付的包冲突,会唤起失败,我就是把shareSDK删除了就能唤起支付页面。微信分享用官网自带的吧,不要用第三分的集成了,太他妈的坑了,坑了半天的时间。就此支付成功了。。。。

时间: 2024-08-07 12:30:50

iOS 微信支付总结的相关文章

iOS微信支付4G网络下无法调用的坑

<iOS微信支付4G网络下无法调用的坑> 博文链接:http://www.jianshu.com/p/749cd156d598

iOS - 微信支付详解

在iOS开发中,常常会涉及到支付功能,这里对常见的微信支付做一下详细说明 1. 微信支付 1.1 微信开放平台账号的注册 微信开放平台(微信支付需要付费的,注册成功后使用的主要为AppKey/SecretKey,其中SecrectKey交由后台完成集成) 微信开放平台是商户APP接入微信支付开放接口的申请入口,通过此平台可申请微信APP支付. 平台入口:http://open.weixin.qq.com. 1.2 项目的修改与设置 1)首先应该下载SDK并导入项目(这里以友盟自带微信支付说明,具

iOS 微信支付流程详解

背景 自微信支付.支付宝支付入世以来,移动端的支付日渐火热.虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握.从难易程度上讲,不管是微信支付还是支付宝支付都是非常简单的,因为第三方的支付文档非常详细,而且他们内部的安全性也非常高.作为使用这些支付策略的我们,只需要掌握流程,能够实现正常支付的功能即可.为什么要写下这篇博文,原因有二.其一,微信支付流程中有坑,其二,以后忘记了可以拿出来看看. 配置 1.微信支付需要两个账号,财付通和微信开发者,

iOS 微信支付如果遇到跳转只有一个确定请看这里

http://www.cocoachina.com/bbs/read.php?tid-321546.html 今天在联调微信支付,不得不说,和它比起来,阿里的支付sdk真的是太好用了.果然和后端同学在联调的时候发现跳转后出现了这一画面. 这种什么也没有的界面真的是让人抓狂了,点击后返回的状态竟然是-2,用户取消.原本以为是自己的问题,耐着性子配合了@狂龙天使 的demo来调试,最终总结如下: 首先确认 是传递接口的字段导致的问题.是传递接口的字段导致的问题.是传递接口的字段导致的问题. 说几个可

ios微信支付 v3

V2版本和V3版本存在很大的差异. 1. 从成功通过微信支付商户的资料审核返回的邮件开始: 你可以获得这些参数  appid,appSecret,partnerID,    partnerKey(从平台上获得) . 在v3中你获得不到v2所谓的“paySignKey”,--------- 这个把我害残了.当然在v3你真的不需要这个参数了. 2.在做微信支付的时候你要抛弃v2版本的做法,你不需要获得access_token,你不需要用sha1加密.我就是结合v2去做,然后越陷越深. 3. 首先我在

iOS微信支付demo运行报错解决如下

要接入微信支付的小伙伴,首先要下载一份官方demo(APP微信支付官方Demo下载),然后打开工程,准备大干一场. 1.编译报错 编译的时候居然直接报错了(orz) 错误提示: APP微信支付官方Demo报错 解决方法:添加CFNetwork.framework 库选中项目名称 -> 选中TARGETS -> 选中Build Phases -> 在Link Binary With Libraries中添加 -> 点击"+"号,加入CFNetwork.framew

IOS 微信支付

可先下载 app 微信支付 DEMO 1.项目设置APPID 商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID.在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID. 2.注册APPID 商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下: [WXApi registerApp:@"APPID" withDescription:@"demo 2.0"]; 3.

iOS微信支付

移动支付盛行,app接入逐渐成为标配 今天和大家分享一下微信支付的接入 调起微信支付的整个流程是: 一.在appDelegate中配置,并写好方法接受微信返回信息, 二.调用后台接口(自定义)与微信交互,微信返回必要参数,其中最主要一个参数是prepay_id 三.使用appid.noncestr(下面有详细生成方法)package(目前为固定值,直接给@"Sign=WXPay").partnerid(就是mchId)timestamp(时间戳).prepayid生成签名sign 四.

iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。

这两天改版一个旧的APP,要旧貌换新颜,拿到app后进行编译,一直报下面的错误. 报不认识的符号名PayReq错误.奇怪,啥也没动就这样,真不知道给的包是不是本来就是个报错的工程. 不管怎样,要对它修改就先要跑起来啊. 根据错误提示,判断是libwechatsdk.a里面没有这个方法.顺藤摸瓜按照下面的步骤开始了解决旅途. 阶段一 1. 手动添加了微信支付SDK源码到工程 2. pod 'UMengUShare/Social/WeChat'添加了微信分享, 编译时报错如下: 说明导入的微信支付S