iOS 集成微信支付
来源:互联网 发布:wow数据库黑翼之巢 编辑:程序博客网 时间:2024/05/16 08:31
在微信开放平台弄好app支付以后,下载iOS SDK,我们需要配置6个参数 如下图 它在微信支付SDK lib文件夹下的payRequestHandler.h文件中
把上面那几参数配置好,最下面那2个参数,如果服务器端没配置好可以先不修改,就用微信默认的参数就可以。
因为微信支付的SDK代码是ARC的,所以我们需要在配置文件里面设置一下,添加-fno-objc-arc 如下图
我们还需要配置一下info里面的URL Types , URL Schemes里面填写的是APP_ID的值
我们在代理文件(APPDelegate.h)里面导入微信支付的头文件 payRequsestHandler.h、WXApi.h 如下图
我们在AppDelegate.m 实现文件中 写上相应的代码
- //
- // AppDelegate.m
- // 微信支付
- //
- // Created by lairen on 15/8/18.
- // Copyright (c) 2015年 lairen. All rights reserved.
- //
- #import "AppDelegate.h"
- //服务端签名只需要用到下面一个头文件
- //#import "ApiXml.h"
- #import <QuartzCore/QuartzCore.h>
- @interface AppDelegate ()
- @end
- @implementation AppDelegate
- @synthesize window = _window;
- - (id)init{
- if(self = [super init]){
- _scene = WXSceneSession;
- }
- return self;
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
- // 注册微信
- [WXApi registerApp:APP_ID withDescription:@"demo 2.0"];
- //添加通知
- [self addObserver];
- return YES;
- }
- #pragma mark 添加通知
- -(void)addObserver
- {
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(sendPay_demo) name:@"weixinPay" object:nil];
- }
- -(void) changeScene:(NSInteger )scene
- {
- _scene = (enum WXScene)scene;
- }
- -(void) onResp:(BaseResp*)resp
- {
- NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];
- NSString *strTitle;
- if([resp isKindOfClass:[SendMessageToWXResp class]])
- {
- strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];
- }
- if([resp isKindOfClass:[PayResp class]]){
- //支付返回结果,实际支付结果需要去微信服务器端查询
- strTitle = [NSString stringWithFormat:@"支付结果"];
- 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;
- }
- }
- UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil nil];
- [alert show];
- }
- #pragma mark 微信支付 这个适合自己服务器交互调用的方法
- - (void)sendPay
- {
- //从服务器获取支付参数,服务端自定义处理逻辑和格式
- //订单标题
- NSString *ORDER_NAME = @"ios 微信支付";
- //订单金额,单位(元)
- NSString *ORDER_PRICE = @"0.01";
- //根据服务器端编码确定是否转码
- NSStringEncoding enc;
- //if UTF8编码
- //enc = NSUTF8StringEncoding; SP_URL,
- //if GBK编码
- enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
- NSString *urlString = [NSString stringWithFormat:@"?plat=ios&order_no=%@&product_name=%@&order_price=%@",
- [[NSString stringWithFormat:@"%ld",time(0)] stringByAddingPercentEscapesUsingEncoding:enc],
- [ORDER_NAME stringByAddingPercentEscapesUsingEncoding:enc],
- ORDER_PRICE];
- NSLog(@"%@",urlString);
- //解析服务端返回json数据
- NSError *error;
- //加载一个NSURL对象
- NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
- //将请求的url数据放到NSData对象中
- NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
- if ( response != nil) {
- NSMutableDictionary *dict =NULL;
- //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中
- dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];
- NSLog(@"url:%@",dict);
- if(dict != nil){
- NSMutableString *retcode = [dict objectForKey:@"retcode"];
- if (retcode.intValue == 0){
- NSMutableString *stamp = [dict objectForKey:@"timestamp"];
- //调起微信支付
- PayReq* req = [[PayReq alloc] init];
- req.openID = [dict objectForKey:@"appid"];
- req.partnerId = [dict objectForKey:@"partnerid"];
- req.prepayId = [dict objectForKey:@"prepayid"];
- req.nonceStr = [dict objectForKey:@"noncestr"];
- req.timeStamp = stamp.intValue;
- req.package = [dict objectForKey:@"package"];
- req.sign = [dict objectForKey:@"sign"];
- [WXApi sendReq:req];
- //日志输出
- // NSLog(@"%@",req.openID);
- NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
- }else{
- [self alert:@"提示信息" msg:[dict objectForKey:@"retmsg"]];
- }
- }else{
- [self alert:@"提示信息" msg:@"服务器返回错误,未获取到json对象"];
- }
- }else{
- [self alert:@"提示信息" msg:@"服务器返回错误"];
- }
- }
- #pragma mark 微信测试支付 这个是调用的微信服务器的支付接口
- - (void)sendPay_demo
- {
- NSLog(@"微信支付 demo");
- //{{{
- //本实例只是演示签名过程, 请将该过程在商户服务器上实现
- //创建支付签名对象
- payRequsestHandler *req = [payRequsestHandler alloc];
- //初始化支付签名对象
- [req init:APP_ID mch_id:MCH_ID];
- //设置密钥
- [req setKey:PARTNER_ID];
- //}}}
- //获取到实际调起微信支付的参数后,在app端调起支付
- NSMutableDictionary *dict = [req sendPay_demo];
- if(dict == nil){
- //错误提示
- NSString *debug = [req getDebugifo];
- [self alert:@"提示信息" msg:debug];
- NSLog(@"%@\n\n",debug);
- }else{
- NSLog(@"%@\n\n",[req getDebugifo]);
- //[self alert:@"确认" msg:@"下单成功,点击OK后调起支付!"];
- NSMutableString *stamp = [dict objectForKey:@"timestamp"];
- //调起微信支付
- PayReq* req = [[PayReq alloc] init];
- req.openID = [dict objectForKey:@"appid"];
- req.partnerId = [dict objectForKey:@"partnerid"];
- req.prepayId = [dict objectForKey:@"prepayid"];
- req.nonceStr = [dict objectForKey:@"noncestr"];
- req.timeStamp = stamp.intValue;
- req.package = [dict objectForKey:@"package"];
- req.sign = [dict objectForKey:@"sign"];
- [WXApi sendReq:req];
- }
- }
- //客户端提示信息
- - (void)alert:(NSString *)title msg:(NSString *)msg
- {
- UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
- [alter show];
- }
- - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
- {
- return [WXApi handleOpenURL:url delegate:self];
- }
- - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
- {
- return [WXApi handleOpenURL:url delegate:self];
- }
- @end
我们再在ViewController文件中 添加支付按钮。直接在故事版上面拖上2个按钮就可以。第一个按钮是用的微信服务器返回的json数据 第二个按钮返回的是自己服务器返回的json数据,自己服务器返回的数据包括签名证书一些相关的东西,我们做操作演示 就使用微信的服务器
给按钮加上点击方法。方法在ViewController.m文件中 点击方法的时候会发送一个通知给AppDelegate.m文件
#pragma mark 添加通知
-(void)addObserver
{
[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(sendPay_demo)name:@"weixinPay"object:nil];
}
- #import "ViewController.h"
- @interface ViewController ()
- - (IBAction)testPay:(id)sender;
- - (IBAction)realPay:(id)sender;
- @end
- @implementation ViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view, typically from a nib.
- }
- //微信支付测试签名
- - (IBAction)testPay:(id)sender {
- [[NSNotificationCenter defaultCenter] postNotificationName:@"weixinPay" object:nil];
- }
- //微信支付测试签名
- - (IBAction)realPay:(id)sender {
- UIAlertView *alert= [[UIAlertView alloc]initWithTitle:@"友情提示" message:@"服务器端接口还没开放,请稍后再试" delegate:nil cancelButtonTitle:@"好的" otherButtonTitles:nil, nil nil];
- [alert show];
- }
- @end
调用起微信支付后,就会打开微信
ok,到这里我们的微信支付Demo,就已经做完了,同学们,加油啊。
- iOS 集成微信支付
- iOS 集成微信支付
- iOS 集成微信支付
- iOS集成微信支付
- iOS集成微信支付
- iOS 集成微信支付
- iOS微信支付集成
- iOS-集成支付宝支付、微信支付简单总结
- iOS 集成微信支付【转载】
- iOS开发集成微信支付
- iOS应用之微信支付集成
- iOS集成微信支付--Swift
- iOS开发之微信集成支付
- iOS微信支付集成全解
- iOS应用之微信支付集成
- ios 微信支付集成完结--总结
- iOS应用之微信支付集成
- iOS集成微信支付功能
- #学习笔记#(13)仿 kugou-logo-phptoshop
- 听说”双11”是这么解决线上bug的
- 解决Xcode7.0在iPhone 9.2 系统真机测试时出现could not find developer disk image问题
- java中内部类之成员内部类
- 学习笔记(2)-标签传播算法伪代码实现
- iOS 集成微信支付
- MySQL 下创建触发器
- 往android - Eclipse中导入新项目时,出现Remove @Override annotation错误提示
- Linux下如何捕获错误
- JDBC通用查询
- online_judge_1040
- 有趣的数
- 《TCP/IP详解 卷1:协议》 读书笔记 第十一章 UDP:用户数据报协议
- Linux 内核 虚拟地址 物理地址 转换