IOS开发入门之微信APP支付:IOS手机端+java后台版
凌雪 2018-10-10 来源 :网络 阅读 872 评论 0

摘要:本文将带你了解IOS开发入门微信APP支付:IOS手机端+java后台版,希望本文对大家学IOS有所帮助。

本文将带你了解IOS开发入门微信APP支付:IOS手机端+java后台版,希望本文对大家学IOS有所帮助。


       

微信APP支付(IOS手机端+java后台)版

0.介绍预览


针对需要在IOS手机上接入原生微信支付场景,调用微信进行支付。如图:

 

1.资料准备

1.1账号注册

1.2开发者认证

登录,进入账号中心,进行开发者资质认证。

1.3注册应用

认证完成后,进入管理中心,新建移动应用。填写应用资料,其中android版应用签名可通过扫码安装温馨提供的应用获得,详细参考微信文档。创建完成后点击查看,申请开通微信支付。一切准备就绪!

2.Java后台开发

添加依赖

[html]view   plaincopy

print?

org.xmlpull

xmlpull

1.1.3.1

net.sf.json-lib

json-lib

2.3

jdk15

com.thoughtworks.xstream

xstream

1.4.5

com.ning

async-http-client

1.8.13

生成统一订单

[java]view   plaincopy

print?

@RequestMapping(value="/pay/wxpay/params",produces="application/json;charset=utf-8")

@ResponseBody

publicStringsignprams(HttpServletRequestrequest){

Stringres="{code:404}";

try{

//充值金额

Stringaccount=request.getParameter("account");

//用户id

Stringsid=request.getParameter("sid");

Stringsubject="订单标题";

Stringbody="订单描述";

intacc=(int)(Double.valueOf(account)*100);

Stringappid="您的APPID";

Stringout_trade_no="生成您的订单号";

//生成订单数据

SortedMappayMap=genOrderData(request,subject,body,acc,appid,out_trade_no);

savePayLog(out_trade_no,account,sid,body,payMap.get("paySign"),nid,2);

//4.返回数据

res=buildPayRes(payMap,out_trade_no);

}catch(Exceptione){

e.printStackTrace();

res="{code:500}";

}

returnres;

}

privateSortedMapgenOrderData(HttpServletRequestrequest,Stringsubject,Stringbody,

intacc,Stringappid,Stringout_trade_no)

throwsIOException,ExecutionException,InterruptedException,XmlPullParserException{

SortedMapparaMap=newTreeMap();

paraMap.put("appid",appid);

paraMap.put("attach",subject);

paraMap.put("body",body);

paraMap.put("mch_id","您的商户id,到商户平台查看");

paraMap.put("nonce_str",create_nonce_str());

paraMap.put("notify_url","https://pay.xxxxx.com/pay/wxpay/notify.htm");//此路径是微信服务器调用支付结果通知路径

paraMap.put("out_trade_no",out_trade_no);

paraMap.put("spbill_create_ip",request.getRemoteAddr());

paraMap.put("total_fee",acc+"");

paraMap.put("trade_type","APP");

Stringsign=createSign(paraMap);

paraMap.put("sign",sign);

//统一下单https://api.mch.weixin.qq.com/pay/unifiedorder

Stringurl="https://api.mch.weixin.qq.com/pay/unifiedorder";

Stringxml=getRequestXml(paraMap);

StringxmlStr=HttpKit.post(url,xml);

//预付商品id

Stringprepay_id="";

if(xmlStr.indexOf("SUCCESS")!=-1){

Mapmap=WXRequestUtil.doXMLParse(xmlStr);

prepay_id=(String)map.get("prepay_id");

}

SortedMappayMap=newTreeMap();

payMap.put("appid",appid);

payMap.put("partnerid","您的商户id,到商户平台查看");

payMap.put("prepayid",prepay_id);

payMap.put("package","Sign=WXPay");

payMap.put("noncestr",create_nonce_str());

payMap.put("timestamp",WXRequestUtil.create_timestamp());

StringpaySign=createSign(payMap);

payMap.put("paySign",paySign);

returnpayMap;

}

//请求xml组装

publicstaticStringgetRequestXml(SortedMapparameters){

Stringsign="";

StringBuffersb=newStringBuffer();

sb.append("

Setes=parameters.entrySet();

Iteratorit=es.iterator();

while(it.hasNext()){

Map.Entryentry=(Map.Entry)it.next();

Stringkey=(String)entry.getKey();

Stringvalue=(String)entry.getValue();

//if("attach".equalsIgnoreCase(key)||"body".equalsIgnoreCase(key)||"sign".equalsIgnoreCase(key)){

//sb.append("<"+key+">"+value+"");

//}

if("sign".equalsIgnoreCase(key)){

sign="<"+key+">"+value+"";

}else{

sb.append("<"+key+">"+value+"");

}

}

sb.append(sign);

sb.append("");

returnsb.toString();

}

//生成签名

publicStringcreateSign(SortedMapparameters){

StringBuffersb=newStringBuffer();

Setes=parameters.entrySet();

Iteratorit=es.iterator();

while(it.hasNext()){

Map.Entryentry=(Map.Entry)it.next();

Stringk=(String)entry.getKey();

Objectv=entry.getValue();

if(null!=v&&!"".equals(v)

&&!"sign".equals(k)&&!"key".equals(k)){

sb.append(k+"="+v+"&");

}

}

sb.append("key="+WXConfig.APP_PERTNER_KEY);

System.out.println(sb.toString());

Stringsign=MD5Utils.MD5Encode(sb.toString(),"UTF-8").toUpperCase();

returnsign;

}

publicStringcreate_nonce_str(){

Stringchars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

Stringres="";

for(inti=0;i<32;i++){

Randomrd=newRandom();

res+=chars.charAt(rd.nextInt(chars.length()-1));

}

returnres;

}

 

3.IOS客户端开发

导入微信开发包

添加URL   Types

在AppDelegate.m中注册应用

[objc]view   plaincopy

print?

#import"AppDelegate.h"

#import"XSTabBarViewController.h"

#import

#import"WXApi.h"

@interfaceAppDelegate()

@end

@implementationAppDelegate

-(BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{

//Overridepointforcustomizationafterapplicationlaunch.

//[NSThreadsleepForTimeInterval:2.0];

//进入主控制器

self.window=[[UIWindowalloc]init];

self.window.frame=[UIScreenmainScreen].bounds;

self.window.rootViewController=[[XSTabBarViewControlleralloc]init];

[self.windowmakeKeyAndVisible];

//向微信注册应用。

[WXApiregisterApp:@"wxfb96c2a9b531be26"];

returnYES;

}

-(void)onResp:(BaseResp*)resp

{

//NSLog(@"----onResp%@",resp);

/*

ErrCodeERR_OK=0(用户同意)

ERR_AUTH_DENIED=-4(用户拒绝授权)

ERR_USER_CANCEL=-2(用户取消)

code用户换取access_token的code,仅在ErrCode为0时有效

state第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K

lang微信客户端当前语言

country微信用户当前国家信息

*/

if([respisKindOfClass:[SendAuthRespclass]])//判断是否为授权请求,否则与微信支付等功能发生冲突

{

SendAuthResp*aresp=(SendAuthResp*)resp;

if(aresp.errCode==0)

{

//NSLog(@"code%@",aresp.code);

[[NSNotificationCenterdefaultCenter]postNotificationName:@"wechatDidLoginNotification"object:selfuserInfo:@{@"code":aresp.code}];

}

}else{//支付请求回调

//支付返回结果,实际支付结果需要去微信服务器端查询

NSString*strMsg=[NSStringstringWithFormat:@"支付结果"];

NSString*respcode=@"0";

switch(resp.errCode){

caseWXSuccess:

strMsg=@"支付结果:成功!";

//NSLog(@"支付成功-PaySuccess,retcode=%d",resp.errCode);

respcode=@"1";

break;

default:

strMsg=[NSStringstringWithFormat:@"支付结果:失败!retcode=%d,retstr=%@",resp.errCode,resp.errStr];

//NSLog(@"错误,retcode=%d,retstr=%@",resp.errCode,resp.errStr);

respcode=@"0";

break;

}

[[NSNotificationCenterdefaultCenter]postNotificationName:@"wechatDidPayNotification"object:selfuserInfo:@{@"respcode":respcode}];

}

}

//iOS9.0之前的处理方法不保证正确,如有错误还望指正

-(BOOL)application:(UIApplication*)applicationopenURL:(NSURL*)urlsourceApplication:(NSString*)sourceApplicationannotation:(id)annotation

{

NSLog(@"iOS9.0之前");

return[selfapplicationOpenURL:url];

}

-(BOOL)application:(UIApplication*)appopenURL:(NSURL*)urloptions:(NSDictionary*)options{

NSLog(@"iOS9.0之后");

return[selfapplicationOpenURL:url];

}

-(BOOL)applicationOpenURL:(NSURL*)url

{

if([[urlabsoluteString]rangeOfString:@"wxfb96c2a9b531be26://pay"].location==0){

return[WXApihandleOpenURL:urldelegate:self];

}

if([url.hostisEqualToString:@"safepay"])

{

[[AlipaySDKdefaultService]processOrderWithPaymentResult:urlstandbyCallback:nil];

returnYES;

}

returnYES;

}

}

在需要支付的Controller中接受微信支付通知

[objc]view   plaincopy

print?

-(void)viewDidLoad{

[superviewDidLoad];

//接受微信支付通知

[[NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(wechatDidPayNotification:)name:@"wechatDidPayNotification"object:nil];

}

向服务器端获取统一订单,并拉起微信进行支付

[objc]view   plaincopy

print?

-(void)weixinPay

{

NSString*userUrlStr=[NSStringstringWithFormat:@"%@?sid=%@&account=%@&desc=%@",WX_PREPAY_URL,self.student.sid,self.payJinE,self.student.nid];

NSURL*url=[NSURLURLWithString:userUrlStr];

//NSLog(@"userUrlStr=%@",userUrlStr);

NSURLRequest*request=[NSURLRequestrequestWithURL:url];

AFHTTPRequestOperation*operation=[[AFHTTPRequestOperationalloc]initWithRequest:request];

[MBProgressHUDshowMessage:@"跳转中,请稍候"];

[operationsetCompletionBlockWithSuccess:^(AFHTTPRequestOperation*operation,NSDictionary*responseObject){

[MBProgressHUDhideHUD];

//NSLog(@"微信支付的response=%@",operation.responseString);

NSData*JSONData=[operation.responseStringdataUsingEncoding:NSUTF8StringEncoding];

NSDictionary*userDict=[NSJSONSerializationJSONObjectWithData:JSONDataoptions:NSJSONReadingMutableLeaveserror:nil];

//调用微信支付

PayReq*request=[[PayReqalloc]init];

/**商家向财付通申请的商家id*/

request.partnerId=[userDictobjectForKey:@"partnerid"];

/**预支付订单*/

request.prepayId=[userDictobjectForKey:@"prepayid"];

/**商家根据财付通文档填写的数据和签名*/

request.package=[userDictobjectForKey:@"package"];

/**随机串,防重发*/

request.nonceStr=[userDictobjectForKey:@"noncestr"];

/**时间戳,防重发*/

request.timeStamp=[[userDictobjectForKey:@"timestamp"]intValue];

/**商家根据微信开放平台文档对数据做的签名*/

request.sign=[userDictobjectForKey:@"sign"];

self.sign=request.sign;

self.ordnum=[userDictobjectForKey:@"ordnum"];

[WXApisendReq:request];

}failure:^(AFHTTPRequestOperation*operation,NSError*error){

[MBProgressHUDhideHUD];

NSLog(@"发生错误!%@",error);

}];

NSOperationQueue*queue=[[NSOperationQueuealloc]init];

[queueaddOperation:operation];

}

//微信支付结果

-(void)wechatDidPayNotification:(NSNotification*)notification

{

//NSLog(@"wechatDidPayNotification");

NSDictionary*nameDictionary=[notificationuserInfo];

NSString*respcode=[nameDictionaryobjectForKey:@"respcode"];

if([respcodeisEqualToString:@"1"]){

//支付成功,更新用户信息

[selfpayDidFinish];

}else{

//支付失败,

[selfsetupAlertControllerWithTitle:@"微信支付结果"messge:@"本次支付未完成,您可以稍后重试!"confirm:@"好的"];

}

}

    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之IOS频道!


本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程