ios王者荣耀微信充值ios区,可以用王者荣耀微信充值ios支付充值吗

IOS客户端接入微信支付
字体:[ ] 类型:转载 时间:
对于一个ios的app,如果有一些虚拟的商品或者服务需要通过在线支付来收费的话,一般有几种主流的选择。如果是通过APP调用支付平台APP的思路的话,一个是调起支付宝客户端,一个则是调起微信支付。本文给大家分享ios客户端接入微信支付,需要的朋友可以参考下
实际上,从代码的角度,调起支付APP就是把一些关键的参数通过一定方式打包成为一个订单,然后发送到支付平台的服务器。所以,只要搞清楚了参数设置,搞清楚了每个支付平台的SDK里面一些关键API的使用,基本上就可以很简单的支持支付。
今天记录一下客户端里面,如何支持微信支付。首先。我们要仔细阅读一下微信SDK的开发文档,了解一下整个支付的大概流程。
然后根据提示,把相应的SDK下载下来,所谓的SDK,也就是一个链接库和两个头文件,很简单。
下载完毕,需要把SDK导入到工程里面,并且配置一下工程。因为开发者文档已经有详细描述,这里就不再复述。
从文档看到,调起微信支付其实最核心的是一下这么一段
&code class="hljs" vbscript=""&PayReq *request = [[[PayReq alloc] init] autorelease];
request.partnerId = @;
request.prepayId= @fc314aa427;
request.package = @Sign=WXP
request.nonceStr= @a462b76eed6e13c64b4fd1c;
request.timeStamp= @;
request.sign= @DD2B03AD8CB16E7A256;
[WXApi sendReq:request];&/code&
这里的范例是一段hardcode,真正使用的时候,参数都需要自行传入。
为了搞清楚如何使用API,我们可以下载Sample代码。不过,这个sample代码应该是微信的实习生写的,而且应该是一个对于C++比较熟悉,对于ObjectC比较陌生的实习生。。。代码风格可以看出很多东西哈。。所以这个sample读起来总觉得有点奇怪。当然,写出这个demo也是需要不错的水平,因为这个sample不仅仅是一些API的调用,还包括了一些算法的实现,MD5之类的。
看懂了sample之后,一般可以自己重构一下,成为自己APP里面的一个Manager类。
我是在下载的微信Sampel代码,里面包括有:
payRequestHandler.h
payRequestHandler.m
如果比较看重命名规范的OC程序猿,就会觉得这个payRequestHandler类非常别扭,不符合camel命名规则,而且handler这个词更偏向于c++风格。我就以这个类为原型,重构了一下,并改装成一个传参的方法,供自己的APP调用。APP里面卖商品,一般就是商品名字,价格两个关键参数。所以这个重构的方法也只是提供这两个参数的接口。
ApiXml.h && ApiXml.m && WXUtil.h && WXUtil.m不变
&code class="hljs" objectivec=""&//
// WechatPayManager.h
// Created by HuangCharlie on 5/24/15.
#import &foundation foundation.h=""&
#import WXUtil.h
#import ApiXml.h
#import WXApi.h
// 账号帐户资料
// 更改商户把相关参数后可测试
#define APP_ID
@wx@@@@@@@@@@@@@@@@
#define APP_SECRET
//appsecret,看起来好像没用
//商户号,填写商户对应参数
#define MCH_ID
@@@@@@@@@@@
//商户API密钥,填写相应参数
#define PARTNER_ID
//支付结果回调页面
#define NOTIFY_URL
@http://wxpay./pub_v2/pay/notify.v2.php
//获取服务器端支付数据地址(商户自定义)(在小吉这里,签名算法直接放在APP端,故不需要自定义)
#define SP_URL
@http://wxpay./pub_v2/app/app_pay.php
@interface WechatPayManager : NSObject
//预支付网关url地址
@property (nonatomic,strong) NSString* payU
//debug信息
@property (nonatomic,strong) NSMutableString *debugI
@property (nonatomic,assign) NSInteger lastErrC//返回的错误码
//商户关键信息
@property (nonatomic,strong) NSString *appId,*mchId,*spK
//初始化函数
-(id)initWithAppID:(NSString*)appID
mchID:(NSString*)mchID
spKey:(NSString*)
//获取当前的debug信息
-(NSString *) getDebugI
//获取预支付订单信息(核心是一个prepayID)
- (NSMutableDictionary*)getPrepayWithOrderName:(NSString*)name
price:(NSString*)price
device:(NSString*)
&/foundation&&/code&
&code class="hljs" objectivec=""&//
// WechatPayManager.m
// Created by HuangCharlie on 5/24/15.
#import WechatPayManager.h
@implementation WechatPayManager
//初始化函数
-(id)initWithAppID:(NSString*)appID mchID:(NSString*)mchID spKey:(NSString*)key
self = [super init];
//初始化私有参数,主要是一些和商户有关的参数
self.payUrl
= @https://api.mch./pay/
if (self.debugInfo == nil){
self.debugInfo = [NSMutableString string];
[self.debugInfo setString:@];
self.appId = appID;//微信分配给商户的appID
self.mchId = mchID;//
self.spKey =//商户的密钥
//获取debug信息
-(NSString*) getDebugInfo
NSString *res = [NSString stringWithString:self.debugInfo];
[self.debugInfo setString:@];
//创建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) {
![[dict objectForKey:categoryId] isEqualToString:@]
&& ![categoryId isEqualToString:@sign]
&& ![categoryId isEqualToString:@key]
[contentString appendFormat:@%@=%@&, categoryId, [dict objectForKey:categoryId]];
//添加key字段
[contentString appendFormat:@key=%@, self.spKey];
//得到MD5 sign签名
NSString *md5Sign =[WXUtil md5:contentString];
//输出Debug Info
[self.debugInfo appendFormat:@MD5签名字符串:
,contentString];
return md5S
//获取package带参数的签名包
-(NSString *)genPackage:(NSMutableDictionary*)packageParams
NSString *
NSMutableString *reqPars=[NSMutableString string];
//生成签名
= [self createMd5Sign:packageParams];
//生成xml的package
NSArray *keys = [packageParams allKeys];
[reqPars appendString:@&xml&
for (NSString *categoryId in keys) {
[reqPars appendFormat:@&%@&%@&!--%@--&
, categoryId, [packageParams objectForKey:categoryId],categoryId];
[reqPars appendFormat:@&sign&%@&/sign&
&/xml&, sign];
return [NSString stringWithString:reqPars];
//提交预支付
-(NSString *)sendPrepay:(NSMutableDictionary *)prePayParams
NSString *prepayid =
//获取提交支付
NSString *send
= [self genPackage:prePayParams];
//输出Debug Info
[self.debugInfo appendFormat:@API链接:%@
, self.payUrl];
[self.debugInfo appendFormat:@发送的xml:%@
//发送请求post xml数据
NSData *res = [WXUtil httpSend:self.payUrl method:@POST data:send];
//输出Debug Info
[self.debugInfo appendFormat:@服务器返回:
,[[NSString alloc] initWithData:res encoding:NSUTF8StringEncoding]];
XMLHelper *xml = [[XMLHelper alloc] autorelease];
//开始解析
[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]) {
//验证业务处理状态
= [resParams objectForKey:@prepay_id];
return_code = 0;
[self.debugInfo appendFormat:@获取预支付交易标示成功!
self.lastErrCode = 1;
[self.debugInfo appendFormat:@gen_sign=%@
,sign,send_sign];
[self.debugInfo appendFormat:@服务器返回签名验证错误!!!
self.lastErrCode = 2;
[self.debugInfo appendFormat:@接口返回错误!!!
- (NSMutableDictionary*)getPrepayWithOrderName:(NSString*)name
price:(NSString*)price
device:(NSString*)device
//订单标题,展示给用户
NSString* orderName =
//订单金额,单位(分)
NSString* orderPrice =//以分为单位的整数
//支付设备号或门店号
NSString* orderDevice =
//支付类型,固定为APP
NSString* orderType = @APP;
//发器支付的机器ip,暂时没有发现其作用
NSString* orderIP = @196.168.1.1;
//随机数串
srand( (unsigned)time(0) );
NSString *noncestr = [NSString stringWithFormat:@%d, rand()];
NSString *orderNO
= [NSString stringWithFormat:@%ld,time(0)];
//================================
//预付单参数订单设置
//================================
NSMutableDictionary *packageParams = [NSMutableDictionary dictionary];
[packageParams setObject: self.appId forKey:@appid];
//开放平台appid
[packageParams setObject: self.mchId forKey:@mch_id];
[packageParams setObject: orderDevice forKey:@device_info]; //支付设备号或门店号
[packageParams setObject: noncestr
forKey:@nonce_str];
[packageParams setObject: orderType
forKey:@trade_type]; //支付类型,固定为APP
[packageParams setObject: orderName
forKey:@body];
//订单描述,展示给用户
[packageParams setObject: NOTIFY_URL forKey:@notify_url]; //支付结果异步通知
[packageParams setObject: orderNO
forKey:@out_trade_no];//商户订单号
[packageParams setObject: orderIP
forKey:@spbill_create_ip];//发器支付的机器ip
[packageParams setObject: orderPrice
forKey:@total_fee];
//订单金额,单位为分
//获取prepayId(预支付交易会话标识)
NSString *preP
prePayid = [self sendPrepay:packageParams];
if(prePayid == nil)
[self.debugInfo appendFormat:@获取prepayid失败!
//获取到prepayid后进行第二次签名
*package, *time_stamp, *nonce_
//设置支付参数
time(&now);
time_stamp = [NSString stringWithFormat:@%ld, now];
nonce_str = [WXUtil md5:time_stamp];
//重新按提交格式组包,微信客户端暂只支持package=Sign=WXPay格式,须考虑升级后支持携带package具体参数的情况
= [NSString stringWithFormat:@Sign=%@,package];
= @Sign=WXP
//第二次签名参数列表
NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
[signParams setObject: self.appId forKey:@appid];
[signParams setObject: self.mchId forKey:@partnerid];
[signParams setObject: nonce_str
forKey:@noncestr];
[signParams setObject: package
forKey:@package];
[signParams setObject: time_stamp
forKey:@timestamp];
[signParams setObject: prePayid
forKey:@prepayid];
//生成签名
NSString *sign = [self createMd5Sign:signParams];
//添加签名
[signParams setObject: sign
forKey:@sign];
[self.debugInfo appendFormat:@第二步签名成功,sign=%@
//返回参数列表
return signP
@end&/code&
然后,在需要调用微信支付的Controller里面,新建一个方法。在合适的地方调用。这个方法里面利用WechatPayManager这个类进行了初始化和参数封装,然后把上述的核心代码(PayReq那一段)
&code class="hljs" objectivec=""&- (void)wxPayWithOrderName:(NSString*)name price:(NSString*)price
//创建支付签名对象 && 初始化支付签名对象
WechatPayManager* wxpayManager = [[[WechatPayManager alloc]initWithAppID:APP_ID mchID:MCH_ID spKey:PARTNER_ID] autorelease];
//获取到实际调起微信支付的参数后,在app端调起支付
//生成预支付订单,实际上就是把关键参数进行第一次加密。
NSString* device = [[UserManager defaultManager]userId];
NSMutableDictionary *dict = [wxpayManager getPrepayWithOrderName:name
price:price
device:device];
if(dict == nil){
//错误提示
NSString *debug = [wxpayManager getDebugInfo];
NSMutableString *stamp = [dict objectForKey:@timestamp];
//调起微信支付
PayReq* req
= [[[PayReq alloc] init]autorelease];
req.openID
= [dict objectForKey:@appid];
req.partnerId
= [dict objectForKey:@partnerid];
req.prepayId
= [dict objectForKey:@prepayid];
req.nonceStr
= [dict objectForKey:@noncestr];
req.timeStamp
= stamp.intV
req.package
= [dict objectForKey:@package];
= [dict objectForKey:@sign];
BOOL flag = [WXApi sendReq:req];
BOOL flag = [WXApi safeSendReq:req];
再者,支付完成了需要调用一个delegate,这个delegate方便个性化显示支付结果。一般直接把这两个delegate放在AppDelegate就好了。因为有一些其他内容也是需要在AppDelegate里面实现,省的分开找不到。
&code class="hljs" objectivec=""&-(void) onResp:(BaseResp*)resp
//启动微信支付的response
NSString *strMsg = [NSString stringWithFormat:@errcode:%d, resp.errCode];
if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
switch (resp.errCode) {
strMsg = @支付结果:成功!;
strMsg = @支付结果:失败!;
strMsg = @用户已经退出支付!;
strMsg = [NSString stringWithFormat:@支付结果:失败!retcode = %d, retstr = %@, resp.errCode,resp.errStr];
注意事项:
1)如果APP里面已经使用了ShareSDK,就有一些地方要注意。不要再重复导入微信的SDK,因为shareSDK里面的extend已经包括了微信的SDK。
2)微信本身是鼓励客户APP把签名算法放到服务器上面,这样信息就不容易被破解。但是如果客户APP本身没有服务器端,或者认为不需要放到服务器端,也可以直接把签名(加密)的部分直接放在APP端。Sample代码的注释有点乱,多次提到服务器云云,但是其实可以不这么做。
3)微信的price单位是分。注意下即可。
4)暂时想不到,以后想到了再记录。。
以上是本文给大家叙述的IOS客户端接入微信支付的全部内容,希望大家喜欢。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具iOS 支付 [支付宝、银联、微信]
招聘信息:
作者: 授权本站转载。这是开头语前不久做了一个项目,涉及到支付宝和银联支付,支付宝和银联都是业界的老大哥,文档、SDK都是很屌,屌的找不到,屌的看不懂,屌到没朋友(吐槽而已),本文将涉及到的最新可用SDK、文档,以及本人支付遇到的一些坑标记一下。资料 //文档idk都包含了安卓、iOS版Demo给了一个订单号,做测试使用,若出现支付失败什么的,可能是已经被别人给支付了,或者是服务器订单过期了 ~一、支付宝1.1 请阅读支付宝文档和Demo1.2 导入对应的库将支付宝Demo中得这些东西全拷贝过来localhost:alipay&mac$&ls
APAuthV2Info.h&&&&&&&&Order.h&&&&&&&&&&&&libssl.a
APAuthV2Info.m&&&&&&&&Order.m&&&&&&&&&&&&openssl
AlipaySDK.bundle&&&&Util
AlipaySDK.framework&&&&libcrypto.a导入系统库SystemConfiguration.framework设置一下search pathsbuild&setting&->搜索search&path,然后你懂的完成后,编译一下,看有没有错,有错没错,还是下一步吧。1.3 对接支付宝对节前,你还是需要从服务器拿到一下一堆东西支付宝接口文档中写了3p参数列表,--! 总结下我用的到,或者说是Demo中提到的,别的就超出范围了合作者身份ID&&&&&alipayPartner&=&@"2088一串数字";
接口名称&&&&&&&&&&&&&alipaySeller&=&@"";
签名&&&&&&&&&&&&&&&&aliPayPrivateKey&=&@"很长很长的私钥";
//公钥&&&&&&&&&&&&alipayRSA_PUBLIC=@"一般长";&&客户端不用服务器都给我了--~!
服务器异步通知页面路径&&alipayNotifServerURL&=&@"一个网址";&//支付结果,支付宝会通知服务器其他一些参数(与购买产品相关,设计到业务了,客户端/服务器谁提供均可)直接贴order代码了,具体看我的Demo示例.Order&\*order&=&[[Order&alloc]&init];
&&&&&&&&&&&&&&&&&&&&order.partner&=&alipayPartner&;
&&&&&&&&&&&&&&&&&&&&order.seller&=&alipayS
&&&&&&&&&&&&&&&&&&&&order.tradeNO&=&&//订单ID(由商家自行制定)
&&&&&&&&&&&&&&&&&&&&order.productName&=&[NSString&stringWithFormat:@"汽车服务充值-%@",@"支付"];&//商品标题
&&&&&&&&&&&&&&&&&&&&order.productDescription&=&[NSString&stringWithFormat:@"%@:支付宝移动支付充值",@"xxxx"];&//商品描述
&&&&&&&&&&&&&&&&&&&&order.amount&=&_txtCNY.&//商品价格
&&&&&&&&&&&&&&&&&&&&order.notifyURL&=&&alipayNotifServerURL;&//回调URL
&&&&&&&&&&&&&&&&&&&&order.service&=&@"mobile.securitypay.pay";
&&&&&&&&&&&&&&&&&&&&order.paymentType&=&@"1";
&&&&&&&&&&&&&&&&&&&&order.inputCharset&=&@"utf-8";
&&&&&&&&&&&&&&&&&&&&order.itBPay&=&@"30m";
&&&&&&&&&&&&&&&&&&&&order.showUrl&=&@"";
&&&&&&&&&&&&&&&&&&&&//应用注册scheme,在AlixPayDemo-Info.plist定义URL&types
&&&&&&&&&&&&&&&&&&&&NSString&*appScheme&=&URLS调用支付宝[[AlipaySDK&defaultService]&payOrder:orderString&fromScheme:appScheme&callback:^(NSDictionary&*resultDic)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSLog(@"reslut&=&%@",resultDic);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&([resultDic[@"resultStatus"]&intValue]==9000)&{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//进入充值列表页面
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSLog(@"支付成功");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&&&&&&&&&else{
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSString&*resultMes&=&resultDic[@"memo"];
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&resultMes&=&(resultMes.length<=0?@"支付失败":resultMes);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NSLog(@"%@",resultMes);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&}
&&&&}];你可能会发现回调不行->设置回调shema//上面支付时已经传给了支付宝客户端回调shema名称
&NSString&*appScheme&=&URLS
&//具体设置shema方法此处就不再累赘,这儿需要处理来自支付宝shema回调,才能完成上面方法的block回调
&在APPDelegate&-
&&-&(BOOL)application:(UIApplication&*)application
&&&&&&&&&&&&openURL:(NSURL&*)url
&&sourceApplication:(NSString&*)sourceApplication
&&&&&&&&&annotation:(id)annotation&{
&&&&&&&&&//跳转支付宝钱包进行支付,处理支付结果
&&&&[[AlipaySDK&defaultService]&processOrderWithPaymentResult:url&standbyCallback:^(NSDictionary&*resultDic)&{
&&&&&&&&NSLog(@"result&=&%@",resultDic);
&&&&return&YES;
}二、银联2.1 请去看银联文档和demo2.2 导入对应的库SDK说明SDK分为以下两个版本:① & &支持纯无卡交易静态库,以下简称UPPayPlugin,包含文件:UPPayPlugin.h
UPPayPluginDelegate.h
libUPPayPlugin.a② & &支持纯无卡交易和VIPOS音频口支付静态库,以下简称UPPayPluginPro,包含文件:UPPayPluginPro.h
UPPayPluginDelegate.h
libUPPayPluginPro.a大概这两个库就是上述那样(嗯,装懂了),具体问商务/后者后台,我们只需要知道②需要将.m改成.mm (应该是用c++封装的音频...??)添加SDK包a) & &根据商户选择的SDK版本,将sdk/inc目录和sdk/libs目录下对应版本的三个文件添加到UPPayDemo工程中;b) & &如果你选择的是UPPayPlugin版本,添加QuartzCore.framework、Security.framework到工程中;c) & &如果你选择的是UPPayPluginPro版本,添加QuartzCore.framework、AudioToolbox.framework, CoreAudio.framework、 MediaPlayer.framework, AVFoundation.framework和Security.framework到工程中;d) & &在工程的Build Settings中找到Other Linker Flags中添加-ObjC宏;导入到工程,让服务器准备一下交易流水号信息 (什么他们不懂,让他们去看文档 ),休息一下,喝杯什么好了2.3 对接咱们的服务器也是挺给力的,一盏茶的功夫,就将交易流水号信息 给准备好了,嗯不错,速度对接一下。&+&(BOOL)startPay:(NSString*)tn&
mode:(NSString*)mode&
viewController:(UIViewController*)viewController&
delegate:(id)-------------参数说明(必填)-------------------tn&&&&&&&&&&&&&&&&&NSString*&&&&&&&&&&&&&&&&&&&交易流水号信息,银联后台生成,通过商户后台返回到客户端并传入支付控件;&
mode&&&&&&&&&&&&NSString*&&&&&&&&&&&&&&&&&接入模式设定,两个值:@"00":代表接入生产环境(正式版本需要);@"01":代表接入开发测试环境(测试版本需要);
viewController&&&&UIViewController*&&&&&&&&&&商户应用程序调用银联手机支付的当前UIViewController;
delegate&&&&&&&&id&&&&&实现UPPayPluginDelegate方法的UIViewController;嗯,这些都是文档中的,请仔细看看[上线的时候一定药修改mode模式]。mode在测试环境下可以银联给的测试号 tn=@"01" 测试环境测试使用卡号、手机号信息(此类信息仅供测试,不会发生正式交易)招商银行预付费卡:卡号:45 6785密码:111101[这个居然无效]再来一个:银行卡号:0000018身份证号:218366手 机 号 :验 证 码 :123456 【要点击获取验证码,不然提交会报错】viewcontroller需要干这些事情*引入头文件&&\#import&"UPPayPluginPro.h"
&&&&&&&&[UPPayPluginPro&startPay:tn&mode:self.tnMode&viewController:self&delegate:self];
*实现对应代理方法
&&&&&&&&\#pragma&mark&UPPayPluginResult
&&&&&&&&-&(void)UPPayPluginResult:(NSString&\*)result
&&&&&&&&&&&&NSString\*&msg&=&[NSString&stringWithFormat:@"%@",&result];
&&&&&&&&&&&&NSLog(@"msg%@",msg);
&&&&&&&&&&&&if&([result&isEqualToString:@"msgcancel"])&{
&&&&&&&&&&&&&&&&NSLog(@"取消银联支付...");
&&&&&&&&&&&&}
&&&&&&&&&&&&else&if([result&containsString:@"success"]){
&&&&&&&&&&&&&&&&NSLog(@"支付成功");
&&&&&&&&&&&&}
&&&&&&}微信支付总体来说微信支付需要审核的比较麻烦,我也没有去弄一个号亲自测试一下,按照文档demo去走一般不会出什么问题。小记可能遇到银联c++编译问题,把对应的viewcontroller切换成.mm,编译看看。若有CreateRSADataSigner arm64的,请将支付宝给的DataSigner改成.mm即可。
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量7088点击量6141点击量5867点击量5353点击量3560点击量3300点击量3099点击量3000点击量2805
&2016 Chukong Technologies,Inc.
京公网安备89

我要回帖

更多关于 阴阳师ios微信充值 的文章

 

随机推荐