• 实现微信支付的开发,iOS端里面只需要四个步骤:
    • 向服务端请求预支付,获得prepayid以及noncestr;
    • 把参数拼起来签名;
    • 发起支付请求;
    • 处理支付结果。
  • iOS的微信SDK的接入:即为“向微信注册你的应用程序id”、“下载微信终端SDK文件”、“搭建开发环境”、“在代码中使用开发工具包”。详情请参看:iOS微信接入指南。
  • 导入微信支付库:开发者需要在工程中链接上:SystemConfiguration.framework,libz.dylib,libsqlite3.0.dylib,最重要的库是libc++.dylib;
  • iOS微信支付的具体流程:
    • 向服务端请求预支付,获得prepayid以及noncestr
//提交预支付
- (NSString *)sendPrepay:(NSMutableDictionary *)prePayParams {NSString *prepayid = nil;//获取提交支付NSString *send = [self genPackage:prePayParams];//输出Debug Info[debugInfo appendFormat:@"API链接:%@\n", payUrl];[debugInfo appendFormat:@"发送的xml:%@\n", send];//发送请求post xml数据NSData *res = [WXUtil httpSend:payUrl method:@"POST" data:send];//输出Debug Info[debugInfo appendFormat:@"服务器返回:\n%@\n\n",[[NSString alloc] initWithData:res encoding:NSUTF8StringEncoding]];XMLHelper *xml  = [XMLHelper alloc];//开始解析[xml startParse:res];NSMutableDictionary *resParams = [xml getDict];//判断返回NSString *return_code   = [resParams objectForKey:@"return_code"];NSString *result_code   = [resParams objectForKey:@"result_code"];if ([return_code isEqualToString:@"SUCCESS"]) {//生成返回数据的签名NSString *sign      = [self createMd5Sign:resParams ];NSString *send_sign =[resParams objectForKey:@"sign"] ;//验证签名正确性if( [sign isEqualToString:send_sign]) {if( [result_code isEqualToString:@"SUCCESS"]) {//验证业务处理状态prepayid    = [resParams objectForKey:@"prepay_id"];return_code = 0;[debugInfo appendFormat:@"获取预支付交易标示成功!\n"];}}else{last_errcode = 1;[debugInfo appendFormat:@"gen_sign=%@\n   _sign=%@\n",sign,send_sign];[debugInfo appendFormat:@"服务器返回签名验证错误!!!\n"];}}else{last_errcode = 2;[debugInfo appendFormat:@"接口返回错误!!!\n"];}return prepayid;
}- (NSMutableDictionary *)sendPay_WithPrice:(NSString *)order_price orderNo:(NSString *)orderNo {//订单标题,展示给用户NSString *order_name = @"展示给用户的订单标题";//预付单参数订单设置srand( (unsigned)time(0) );NSString *noncestr  = [NSString stringWithFormat:@"%d", rand()];NSString *orderno   = orderNo;NSMutableDictionary *packageParams = [NSMutableDictionary dictionary];[packageParams setObject: appid          forKey:@"appid"];           //开放平台appid[packageParams setObject: mchid          forKey:@"mch_id"];          //商户号[packageParams setObject: @"APP-001"     forKey:@"device_info"];     //支付设备号或门店号[packageParams setObject: noncestr       forKey:@"nonce_str"];       //随机串[packageParams setObject: @"APP"         forKey:@"trade_type"];      //支付类型,固定为APP[packageParams setObject: order_name     forKey:@"body"];            //订单描述,展示给用户[packageParams setObject: NOTIFY_URL     forKey:@"notify_url"];      //支付结果异步通知[packageParams setObject: orderno        forKey:@"out_trade_no"];    //商户订单号[packageParams setObject: @"196.168.1.1" forKey:@"spbill_create_ip"];//发器支付的机器ip[packageParams setObject: order_price    forKey:@"total_fee"];       //订单金额,单位为分//获取prepayId(预支付交易会话标识)NSString *prePayid;prePayid = [self sendPrepay:packageParams];if ( prePayid != nil) {//获取到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 = @"Sign=WXPay";//第二次签名参数列表NSMutableDictionary *signParams = [NSMutableDictionary dictionary];[signParams setObject: appid        forKey:@"appid"];[signParams setObject: nonce_str    forKey:@"noncestr"];[signParams setObject: package      forKey:@"package"];[signParams setObject: mchid        forKey:@"partnerid"];[signParams setObject: time_stamp   forKey:@"timestamp"];[signParams setObject: prePayid     forKey:@"prepayid"];//生成签名NSString *sign = [self createMd5Sign:signParams];//添加签名[signParams setObject: sign forKey:@"sign"];[debugInfo appendFormat:@"第二步签名成功,sign=%@\n",sign];//返回参数列表return signParams;}else{[debugInfo appendFormat:@"获取prepayid失败!\n"];}return nil;
}
  • 把参数拼起来签名
//创建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=%@", spkey];//得到MD5 sign签名NSString *md5Sign =[WXUtil md5:contentString];//输出Debug Info[debugInfo appendFormat:@"MD5签名字符串:\n%@\n\n",contentString];return md5Sign;
}//获取package带参数的签名包
- (NSString *)genPackage:(NSMutableDictionary*)packageParams {NSString *sign;NSMutableString *reqPars=[NSMutableString string];//生成签名sign = [self createMd5Sign:packageParams];//生成xml的packageNSArray *keys = [packageParams allKeys];[reqPars appendString:@"<xml>\n"];for (NSString *categoryId in keys) {[reqPars appendFormat:@"<%@>%@</%@>\n", categoryId, [packageParams objectForKey:categoryId],categoryId];}[reqPars appendFormat:@"<sign>%@</sign>\n</xml>", sign];return [NSString stringWithString:reqPars];
}
  • 发起支付请求
- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];//支付结果通知注册[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"ORDER_PAY_NOTIFICATION" object:nil];
}//调用微信支付
- (void)viewDidLoad {[super viewDidLoad];[self WXPay];
}#pragma mark -- 发起”微信支付“请求
- (void)WXPay {if (![WXApi isWXAppInstalled]) {UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"您还没有安装微信" message:nil preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {//跳转到微信的下载安装地址}];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];return ;}YDWWeChatPayResquest *req = [YDWWeChatPayResquest new];//初始化支付签名对象[req init:APP_ID mch_id:MCH_ID];//设置密钥[req setKey:PARTNER_ID];//获取到实际调起微信支付的参数后,在app端调起支付NSInteger payTheAmount;//支付金额NSString *orderMeony = [NSString stringWithFormat:@"%ld",payTheAmount];NSDictionary *orderDic;//支付订单NSString *orderNo = [orderDic objectForKey:@"orderNumber"];NSMutableDictionary *dict = [req sendPay_WithPrice:orderMeony orderNo: orderNo];if(dict == nil){//错误提示NSString *debug = [req getDebugifo];UIAlertController *alert = [UIAlertController alertControllerWithTitle:debug message:nil preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];}else{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)weixinPay {YDWWeixinPayParams *signParams = [[YDWWeixinPayParams alloc] initWithPrepayid:self.prepay_id noncestr:self.nonce_str];//调起微信支付PayReq *req = [[PayReq alloc] init];req.openID = signParams.appid;req.partnerId = signParams.partnerid;req.prepayId = signParams.prepayid;req.nonceStr = signParams.noncestr;req.timeStamp = signParams.timestamp.intValue;req.package = signParams.package;req.sign = [signParams sign];[WXApi sendReq:req];
}#pragma mark - 支付结果通知信息
- (void)getOrderPayResult:(NSNotification *)notification{if ([notification.object isEqualToString:@"success"]) {UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"恭喜" message:@"您已成功支付啦!" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];}else{UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"支付失败,可在待付款订单中查看" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];}
}//移除通知
- (void)viewWillDisappear:(BOOL)animated{[[NSNotificationCenter defaultCenter]removeObserver:self];
}
    • 处理支付结果,在AppDelegate中做的工作:
    • 1、导入#import “WXApi.h”和#import “WXApiObject.h”,并遵守WXApiDelegate协议,要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[WXApi registerApp:@"WXAppId" withDescription:@"YDWWXPayDes"];return YES;
}
  • 2、重写AppDelegate的handleOpenURL和openURL方法:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
{if ([url.absoluteString hasPrefix:Weixin_Appid]) {return [WXApi handleOpenURL:url delegate:self];} return YES;
}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {return [WXApi handleOpenURL:url delegate:self];
}
  • 3、处理结果:
- (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);NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION" object:@"success"];[[NSNotificationCenter defaultCenter] postNotification:notification];break;}default:{strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION" object:@"fail"];[[NSNotificationCenter defaultCenter] postNotification:notification];break;}}}//        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
//        [alert show];}
  • 常见的问题:
    • 如果跳转到微信里之只弹出了一个确定按钮,那么这时候需要检查几个方面:
    • 1、appid,mch_id,partner_id是否设置正确。mch_id对应的key其实是partnerid,partner_id对应的key其实是key;
    • 2、timestamp 应为10位;
    • 3、签名需要排序,并用md5加密。
  • 最后附上重要的类的全部代码:
    • AppDelegate:
//  AppDelegate.h
//  微信支付
//
//  Created by YDW on 16/3/28.
//  Copyright © 2016年 IZHUO.NET. All rights reserved.
//#import <UIKit/UIKit.h>
#import "WXApi.h"
#import "WXApiObject.h"@interface AppDelegate : UIResponder <UIApplicationDelegate,WXApiDelegate>@property (strong, nonatomic) UIWindow *window;@end//  AppDelegate.m
//  微信支付
//
//  Created by YDW on 16/3/28.
//  Copyright © 2016年 IZHUO.NET. All rights reserved.
//#import "AppDelegate.h"@interface AppDelegate ()@end@implementation AppDelegate- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {[WXApi registerApp:@"WXAppId" withDescription:@"YDWWXPayDes"];return YES;
}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {return [WXApi handleOpenURL:url delegate:self];
}- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {return  [WXApi handleOpenURL:url delegate:self];
}- (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);NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION" object:@"success"];[[NSNotificationCenter defaultCenter] postNotification:notification];break;}default:{strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);NSNotification *notification = [NSNotification notificationWithName:@"ORDER_PAY_NOTIFICATION" object:@"fail"];[[NSNotificationCenter defaultCenter] postNotification:notification];break;}}}//        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
//        [alert show];}

YDWWeChatPayResquest:

//  YDWWeChatPayResquest.h
//  微信支付
//
//  Created by YDW on 16/3/28.
//  Copyright © 2016年 IZHUO.NET. All rights reserved.
//#import <Foundation/Foundation.h>
#import "WXUtil.h"
#import "ApiXml.h"/** 账号的账户资料:更改商户后的相关参数后可以使用*/#define APP_ID        @"你的APP的ID"       //APPID
#define APP_SECRET    @"你的APP的secret"   //appsecret
#define MCH_ID        @"商户号"            //商户号,填写商户对应参数
#define PARTNER_ID    @"商户API密钥"       //商户API密钥,填写相应参数
#define NOTIFY_URL    @"回调页面地址"       //支付结果回调页面
#define SP_URL        @"服务器端支付数据地址"//获取服务器端支付数据地址(商户自定义)@interface YDWWeChatPayResquest : NSObject {//预支付的url地址NSString *payUrl;//lash_errcode;long     last_errcode;//debug信息NSMutableString *debugInfo;NSString        *appid,*mchid,*spkey;}- (BOOL)init:(NSString *)app_id mch_id:(NSString *)mch_id;
- (NSString *)getDebugifo;
- (long)getLasterrCode;
//设置商户密钥
- (void)setKey:(NSString *)key;
//创建package签名
- (NSString*)createMd5Sign:(NSMutableDictionary*)dict;
//获取package带参数的签名包
- (NSString *)genPackage:(NSMutableDictionary*)packageParams;
//提交预支付
- (NSString *)sendPrepay:(NSMutableDictionary *)prePayParams;- (NSMutableDictionary *)sendPay_WithPrice:(NSString *)order_price orderNo:(NSString *)orderNo;
//签名实例测试
//- (NSMutableDictionary *)sendPay_demo;
@end//  YDWWeChatPayResquest.m
//  微信支付
//
//  Created by YDW on 16/3/28.
//  Copyright © 2016年 IZHUO.NET. All rights reserved.
//#import <Foundation/Foundation.h>
#import "YDWWeChatPayResquest.h"@implementation YDWWeChatPayResquest- (BOOL)init:(NSString *)app_id mch_id:(NSString *)mch_id {payUrl     = @"https://api.mch.weixin.qq.com/pay/unifiedorder";if (debugInfo == nil){debugInfo = [NSMutableString string];}[debugInfo setString:@""];appid = app_id;mchid = mch_id;return YES;
}//设置商户密钥
- (void)setKey:(NSString *)key {spkey = [NSString stringWithString:key];
}//获取debug信息
- (NSString*)getDebugifo {NSString *res = [NSString stringWithString:debugInfo];[debugInfo setString:@""];return res;
}//获取最后服务返回错误代码
- (long)getLasterrCode {return last_errcode;
}//创建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=%@", spkey];//得到MD5 sign签名NSString *md5Sign =[WXUtil md5:contentString];//输出Debug Info[debugInfo appendFormat:@"MD5签名字符串:\n%@\n\n",contentString];return md5Sign;
}//获取package带参数的签名包
- (NSString *)genPackage:(NSMutableDictionary*)packageParams {NSString *sign;NSMutableString *reqPars=[NSMutableString string];//生成签名sign = [self createMd5Sign:packageParams];//生成xml的packageNSArray *keys = [packageParams allKeys];[reqPars appendString:@"<xml>\n"];for (NSString *categoryId in keys) {[reqPars appendFormat:@"<%@>%@</%@>\n", categoryId, [packageParams objectForKey:categoryId],categoryId];}[reqPars appendFormat:@"<sign>%@</sign>\n</xml>", sign];return [NSString stringWithString:reqPars];
}//提交预支付
- (NSString *)sendPrepay:(NSMutableDictionary *)prePayParams {NSString *prepayid = nil;//获取提交支付NSString *send = [self genPackage:prePayParams];//输出Debug Info[debugInfo appendFormat:@"API链接:%@\n", payUrl];[debugInfo appendFormat:@"发送的xml:%@\n", send];//发送请求post xml数据NSData *res = [WXUtil httpSend:payUrl method:@"POST" data:send];//输出Debug Info[debugInfo appendFormat:@"服务器返回:\n%@\n\n",[[NSString alloc] initWithData:res encoding:NSUTF8StringEncoding]];XMLHelper *xml  = [XMLHelper alloc];//开始解析[xml startParse:res];NSMutableDictionary *resParams = [xml getDict];//判断返回NSString *return_code   = [resParams objectForKey:@"return_code"];NSString *result_code   = [resParams objectForKey:@"result_code"];if ([return_code isEqualToString:@"SUCCESS"]) {//生成返回数据的签名NSString *sign      = [self createMd5Sign:resParams ];NSString *send_sign =[resParams objectForKey:@"sign"] ;//验证签名正确性if( [sign isEqualToString:send_sign]) {if( [result_code isEqualToString:@"SUCCESS"]) {//验证业务处理状态prepayid    = [resParams objectForKey:@"prepay_id"];return_code = 0;[debugInfo appendFormat:@"获取预支付交易标示成功!\n"];}}else{last_errcode = 1;[debugInfo appendFormat:@"gen_sign=%@\n   _sign=%@\n",sign,send_sign];[debugInfo appendFormat:@"服务器返回签名验证错误!!!\n"];}}else{last_errcode = 2;[debugInfo appendFormat:@"接口返回错误!!!\n"];}return prepayid;
}- (NSMutableDictionary *)sendPay_WithPrice:(NSString *)order_price orderNo:(NSString *)orderNo {//订单标题,展示给用户NSString *order_name = @"展示给用户的订单标题";//预付单参数订单设置srand( (unsigned)time(0) );NSString *noncestr  = [NSString stringWithFormat:@"%d", rand()];NSString *orderno   = orderNo;NSMutableDictionary *packageParams = [NSMutableDictionary dictionary];[packageParams setObject: appid          forKey:@"appid"];           //开放平台appid[packageParams setObject: mchid          forKey:@"mch_id"];          //商户号[packageParams setObject: @"APP-001"     forKey:@"device_info"];     //支付设备号或门店号[packageParams setObject: noncestr       forKey:@"nonce_str"];       //随机串[packageParams setObject: @"APP"         forKey:@"trade_type"];      //支付类型,固定为APP[packageParams setObject: order_name     forKey:@"body"];            //订单描述,展示给用户[packageParams setObject: NOTIFY_URL     forKey:@"notify_url"];      //支付结果异步通知[packageParams setObject: orderno        forKey:@"out_trade_no"];    //商户订单号[packageParams setObject: @"196.168.1.1" forKey:@"spbill_create_ip"];//发器支付的机器ip[packageParams setObject: order_price    forKey:@"total_fee"];       //订单金额,单位为分//获取prepayId(预支付交易会话标识)NSString *prePayid;prePayid            = [self sendPrepay:packageParams];if ( prePayid != nil) {//获取到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         = @"Sign=WXPay";//第二次签名参数列表NSMutableDictionary *signParams = [NSMutableDictionary dictionary];[signParams setObject: appid        forKey:@"appid"];[signParams setObject: nonce_str    forKey:@"noncestr"];[signParams setObject: package      forKey:@"package"];[signParams setObject: mchid        forKey:@"partnerid"];[signParams setObject: time_stamp   forKey:@"timestamp"];[signParams setObject: prePayid     forKey:@"prepayid"];//生成签名NSString *sign = [self createMd5Sign:signParams];//添加签名[signParams setObject: sign forKey:@"sign"];[debugInfo appendFormat:@"第二步签名成功,sign=%@\n",sign];//返回参数列表return signParams;}else{[debugInfo appendFormat:@"获取prepayid失败!\n"];}return nil;
}@end
  • 调用微信支付的页面:
@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];[self WXPay];
}- (void)viewWillAppear:(BOOL)animated {[super viewWillAppear:animated];//支付结果通知注册[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"ORDER_PAY_NOTIFICATION" object:nil];
}#pragma mark -- 发起”微信支付“请求
- (void)WXPay {if (![WXApi isWXAppInstalled]) {UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"您还没有安装微信" message:nil preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {//跳转到微信的下载安装地址}];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];return ;}YDWWeChatPayResquest *req = [YDWWeChatPayResquest new];//初始化支付签名对象[req init:APP_ID mch_id:MCH_ID];//设置密钥[req setKey:PARTNER_ID];//获取到实际调起微信支付的参数后,在app端调起支付NSInteger payTheAmount;//支付金额NSString *orderMeony = [NSString stringWithFormat:@"%ld",payTheAmount];NSDictionary *orderDic;//支付订单NSString *orderNo = [orderDic objectForKey:@"orderNumber"];NSMutableDictionary *dict = [req sendPay_WithPrice:orderMeony orderNo: orderNo];if(dict == nil){//错误提示NSString *debug = [req getDebugifo];UIAlertController *alert = [UIAlertController alertControllerWithTitle:debug message:nil preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];}else{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];}
}#pragma mark - 支付结果通知信息
- (void)getOrderPayResult:(NSNotification *)notification{if ([notification.object isEqualToString:@"success"]) {UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"恭喜" message:@"您已成功支付啦!" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];}else{UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"支付失败,可在待付款订单中查看" preferredStyle:UIAlertControllerStyleAlert];UIAlertAction *sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];[alert addAction:sureAction];[self.navigationController presentViewController:alert animated:YES completion:nil];}
}//移除通知
- (void)viewWillDisappear:(BOOL)animated{[[NSNotificationCenter defaultCenter]removeObserver:self];
}@end

iOS之“微信支付”开发流程相关推荐

  1. JSAPI微信支付开发流程和坑

    首先,我先简要说明一下微信支付开发的流程 众所周知,工欲善其事,必先利其器,微信官方推出了web微信开发工具,有windows.linux.版本的,根据自己的开发环境选择合适自己的,登陆公众平台--& ...

  2. 小程序微信支付开发流程记录

    我所在公司需要开发一款商城小程序,里面需要用到微信支付,我负责里面的下单功能,从小程序端到后台的支付流程都是我自己开发的,由于我们组没有人有开发微信支付的经验,只有我有开发过JSAPI的微信支付的经验 ...

  3. 微信支付开发流程_清晰_易懂_有源码

    转自 https://blog.csdn.net/weixin_41497737/article/details/80547243 最近因为公司需求开始开始做微信支付的开发,在网上参考来了很多文章,大 ...

  4. android支付宝、微信支付开发流程

    这一段时间项目需要加上微信支付和支付宝支付,经过一段时间摸索,总算能够正常进行支付使用了.想想在支付上遇到的坑,我觉得有必要进行一个记录,在后续的开发中避开支付中遇到的坑: 一.支付宝支付: ps:支 ...

  5. iOS之“支付宝支付”开发流程

    支付宝快捷支付的主要步骤: 先与支付宝签约,获得商户ID(partner)和账号ID(seller); 下载相应的公钥私钥文件(加密签名用); 下载支付宝SDK; 生成订单信息; 调用支付宝客户端,由 ...

  6. 微信支付开发(6) 收货地址共享接口

    关键字:微信支付 收货地址共享 作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/p/weixin-editAddress.html 请看新版教程  微信支付开发 ...

  7. 微信支付开发准备工作和详细步骤

    微信支付前的准备工作 1 开发者资质认证 微信支付开发第一步就是使用公司管理者/高层帐号登录微信开放平台,进入"账号中心",进行开发者资质认证,需要填写公司资料,包括但不限于,公司 ...

  8. 工作笔记——微信支付开发相关知识整理

    在最近的工作中,引入了微信小程序支付,在开发过程中积累和整理了一些技术知识,现将其整理如下 目录 一.概念认识 (一)术语介绍 (二)名词解释 (四)对接微信支付接口规则整理 二.微信支付开发参考 ( ...

  9. PHP版本微信支付开发----电脑网站扫码支付(native)(心得、总结)

    早就听说微信支付比支付宝支付的坑多,但还得得该填的填,该绕的绕, 最终我们网站的微信支付功能成功上线啦♪(^ ∇ ^*) 首先自报家门,我的PHP版本是7,微信demo用的是php_sdk_v3.0. ...

最新文章

  1. go的打包依赖构建工具-dep
  2. HTML如何让图片覆盖背景颜色,css – 使用rgba背景颜色覆盖背景图像
  3. winform在表格中输入一个完整的时间字段_【ArcGIS小技巧视频教程】(5):在ArcGIS中挂接其他数据...
  4. vs2008中C#3.0语言的新特性
  5. hdu 4292 Food 最大流
  6. td之间的间距怎么改_论文的一级标题、二级标题格式怎么弄?
  7. 从市场角度看服务器虚拟化
  8. 熟悉的指标,多重的应用
  9. LeetCode(1103)——分糖果 II(JavaScript)
  10. 在线教育平台HTML代码,在线教育学习管理平台html前端源码模板
  11. 超星高级语言程序设计实验作业 (实验03 模块化程序设计)
  12. 修改firefox的ssh插件的xpi包,hook自已功能
  13. 一键开关电路设计(一)
  14. 计算机组装物料清单,物料清单
  15. Windows系统及应用技巧二十六篇
  16. MySQL中的各种查询
  17. “华为”和“荣耀”哪个好?同等品质年轻人更喜欢Ta
  18. 打印魔方阵(C语言)
  19. 凯悦250家店数据外泄 多家高端酒店存安全漏洞
  20. URL传参小用法获取url中的参数

热门文章

  1. Benny:只处理那些NVARCHAR字段,并且NTEXT也是小于4000个字符时的情况.不管类型.只管长度....
  2. Vue.js:监听属性
  3. [svc][op]从历险压缩日志里网站pv uv统计
  4. mysql55和57的区别_技术分享 | MySQL:count(*)、count(字段) 实现上区别
  5. 面对面快传文件服务器恢复,QQ 面对面快传的传应用功能,如何找到已安装应用的安装包?...
  6. android标题返回,【Android开发】自定义控件——带返回键标题栏
  7. h3c 路由器 刷第三方固件_图文版*许迎果 第201期 双11路由器型号推荐之刷机路由篇...
  8. 上海教师中级职称英语计算机考试,计算机教师如果考过了软考中级对职称评定有用吗,学校会承认嘛,有人懂吗,求助...
  9. Java黑皮书课后题第6章:*6.4(反序显示一个整数)使用下面的方法体编写方法,反序显示一个整数…例如reverse(3456)返回6543,编写一个测试程序,提示用户输入一个整数,然后显示它的反序
  10. html 读取物理路径,.Net Core api 中获取应用程序物理路径wwwroot