iOS集成微信支付

原创 2016年08月29日 15:13:12

1,SDK导入

  1. 下载官方SDK:下载地址
  2. 将SDK文件中包含的 libWeChatSDK.a,WXApi.h,WXApiObject.h,WechatAuthSDK 三个文件添加到你所建的工程中,这里要注意别下错了,之前试过下载的SDK名字都一样,但是就是不能够支付,因为那个SDK只能够支持分享和登录。
  3. 添加依赖:
    • SystemConfiguration.framework
    • libz.tbd
    • libsqlite3.tbd
    • CoreTelephony.framework
    • libc++.tbd
  4. TARGETS-BuildSettings-Build Options: Enable Bitcode 设置为NO
  5. 建立PrefixHeader文件,TARGETS-BuildSettings-Apple LLVM7.1-Language :Prefix Headerd, 将建立的pch文件路径填写进去(Xcode右键Show in finder,直接把文件拖到上面,把头路径删除,只留项目名那一级,开头没有/)
  6. PrefixHeader内导入头文件:
     #import <UIKit/UIKit.h>
     #import "WXApi.h"
  7. TARGETS-Info-URL types添加一项,URL scheme为你注册的应用程序id(例如:wx40xxxxxxxxxxxxxx),其它为空不填。
  8. AppDelegate中注册
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        [WXApi registerApp:@"wx40xxxxxxxxxxxxxx" withDescription:@"demo 2.0"];
        return YES;
    }
  9. AppDelegate中设置微信SDK的代理
    - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
        return  [WXApi handleOpenURL:url delegate:self]; //这里设置任何一个实现了WXApiDelegate协议的对象
    }
    
    - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
        return [WXApi handleOpenURL:url delegate:self]; //这里设置任何一个实现了WXApiDelegate协议的对象
    }
  10. 在微信SDK的代理中处理支付结果
    - (void)onResp:(BaseResp *)resp
    {
        if([resp isKindOfClass:[PayResp class]]){
    
            //支付返回结果,实际支付结果需要去微信服务器端查询
            NSString *strMsg;
    
            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;
            }
        }
    }

以上的配置都做完,SDK环境就正式搭好了,其它的在ShareSDK中需要配的诸如白名单什么的,我试了下只导入官方的SDK是不用配的。

2,通过服务器获取订单信息调取支付

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];  // 向服务器请求订单信息的参数
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary];
    parameters[@"token"] = @"app登录帐户的token";
    parameters[@"order_id"] = @"要下单的商品id";
    [manager POST:@"向服务器获取订单信息的url" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dic = responseObject[@"data"];    // 服务器返回的订单数据
        // 通过服务器返回的订单数据创建请求参数
        PayReq *request = [[PayReq alloc] init];
        request.openID = [dic objectForKey:@"appid"];
        request.partnerId = [dic objectForKey:@"partenerId"];
        request.prepayId = [dic objectForKey:@"prepayId"];
        request.package = [dic objectForKey:@"packageValue"];
        request.nonceStr = [dic objectForKey:@"nonceStr"];
        request.timeStamp = (UInt32)[[dic objectForKey:@"timeStamp"] integerValue];
        request.sign = [dic objectForKey:@"sign"];
        // 调起微信客户端发起支付
        [WXApi sendReq:request];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

    }];

3,本地生成订单信息支付

    NSString *tradeNO = [self generateTradeNO];
    NSString *addressIP = [self getIPAddress:YES];
    NSString *orderno = [NSString stringWithFormat:@"%ld",time(0)];
    DataMD5 *data = [[DataMD5 alloc] initWithAppid:WX_APPID mch_id:MCH_ID nonce_str:tradeNO partner_id:WX_PartnerKey body:@"充值" out_trade_no:orderno total_fee:PRICE spbill_create_ip:addressIP notify_url:NOTIFY_URL trade_type:TRADE_TYPE];
    NSString *string = [[data dic] XMLString];

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
    [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
    [manager.requestSerializer setValue:WXUNIFIEDORDERURL forHTTPHeaderField:@"SOAPAction"];
    [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString * _Nonnull(NSURLRequest * _Nonnull request, id  _Nonnull parameters, NSError * _Nullable __autoreleasing * _Nullable error) {
        return string;
    }];
    [manager POST:WXUNIFIEDORDERURL parameters:string progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSDictionary *dic = [NSDictionary dictionaryWithXMLString:responseString];
        if ([[dic objectForKey:@"result_code"] isEqualToString:@"SUCCESS"] && [[dic objectForKey:@"return_code"] isEqualToString:@"SUCCESS"]) {
            PayReq *request = [[PayReq alloc] init];
            request.openID = [dic objectForKey:WXAPPID];
            request.partnerId = [dic objectForKey:WXMCHID];
            request.prepayId = [dic objectForKey:WXPREPAYID];
            request.package = @"Sign=WXPay";
            request.nonceStr = [dic objectForKey:WXNONCESTR];
            NSDate *datenow = [NSDate date];
            NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
            UInt32 timeStamp = [timeSp intValue];
            request.timeStamp = timeStamp;
            DataMD5 *md5 = [[DataMD5 alloc] init];
            request.sign = [md5 createMD5SingForPay:request.openID partnerid:request.partnerId prepayid:request.prepayId package:request.package noncestr:request.nonceStr timestamp:request.timeStamp];
            [WXApi sendReq:request];
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

    }];

本地生成订单支付的处理比较麻烦,具体代码详见Demo

4,Demo下载

Gitgub: https://github.com/Joker-388/WechatDemo.git

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

iOS开发中微信支付集成

今天又做了微信支付,对于客户端来说,微信支付和支付宝支付相比较还是没有多大差别的,只不过微信支付上传的参数多了些。(但听后台说微信支付较复杂)。 先说下微信支付的流程(个人的理解):(先附上官方文档...
  • u010105969
  • u010105969
  • 2017年09月07日 15:44
  • 555

iOS 集成微信支付

微信支付现在是移动支付领域一支不可忽视的力量,我们移动开发人员在开发app的时候,也不可避免的用到各种支付,支付宝支付我们用的最多了,我这里就不讲解了,我现在给大家讲解一个iOS微信支付,首先 我们需...
  • joonchen111
  • joonchen111
  • 2015年09月08日 10:44
  • 5019

iOS开发技巧之: iOS 集成支付宝和微信支付

最近因为项目需要,需要接入移动支付,下面就根据我们项目集成支付的过程做一个简单总结,包括集成支付宝和微信的大体流程,在集成的过程中遇到的问题以及支付宝和微信支付的简单比较,本人水平有限,如果大家觉得有...
  • vkooy
  • vkooy
  • 2017年03月23日 13:36
  • 1004

React Native (IOS和Android) 支付宝和微信支付集成实战(微信IOS篇)

序言:React Native无论是在社区和应用程度上,在国内外是十分广泛和普及的。而支付宝和微信在支付模块上都有或多或少的支持,虽然没有完整的Demo,不过在我做过一个相关集成的项目后,在此我把相关...
  • likeconan123
  • likeconan123
  • 2018年01月09日 16:51
  • 114

iOS集成微信支付问题, 友盟SDK有干扰或者说是冲突的解决

—— 项目中遇到的问题 原因描述: 由于前期的app开发由外包完成, 所以并不清楚项目中用的友盟SDK的版本. 导致在集成微信支付时, 调起微信app并没有反应, 或者说是调起失败. 解决办法:...
  • sinat_30162391
  • sinat_30162391
  • 2016年01月27日 12:25
  • 4060

iOS-支付宝&微信支付

一. 微信支付 1.所需要的材料 微信SDK 微信SDK在微信开放平台上面申请得到的参数 // 应用的APPID kWXAppID @"wxc82cXXXXXXXX" //...
  • u011452278
  • u011452278
  • 2017年06月02日 18:00
  • 2900

iOS集成微信支付--Swift

微信支付在微信红包的推动发展势头越来越猛,甚至有超过支付宝的趋势,那么在App集成微信支付也是比不可少了。我最近在一个项目中集成微信支付遇到了不少问题,Google了不少资料才搞定,不得不吐槽一下微信...
  • mo_xiao_mo
  • mo_xiao_mo
  • 2016年09月21日 11:21
  • 573

iOS开发 解决同时使用友盟三方登录 和 微信支付 不走回调的问题

在项目中有可能会使用到友盟的三方登录  和 微信支付   微信支付  会出现不走回调的问题  下面说一下如何解决 //url Schemes回调 - (BOOL)application:(UIA...
  • Modesty_zhao
  • Modesty_zhao
  • 2017年03月06日 16:12
  • 256

ios 微信支付官方demo编译报错的解决办法

ios 微信支付官方demo编译报错的解决办法 1.是因为缺少两个库支持:CFNetwork.framework     libc++.tbd 2.运行是报错[_NSArrayM enqueue:...
  • lf902250
  • lf902250
  • 2017年03月02日 14:51
  • 1038

phonegap(cordova) 自定义插件代码篇(六)----android ,iOS 微信支付工具整合

还是那句话,在使用插件代码篇的时候,请先了解插件机制(如整合原生插件先阅读原生插件文档,很重要!很重要!很重要!),如未了解,请先阅读入门篇,这里就专贴关键代码 必须先把官方sdk 按照要求一步一步的...
  • zlj002
  • zlj002
  • 2016年01月08日 16:50
  • 2511
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS集成微信支付
举报原因:
原因补充:

(最多只允许输入30个字)