当前位置: 移动技术网 > IT编程>移动开发>IOS > 微信APP支付:IOS手机端+java后台版

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

2018年02月02日  | 移动技术网IT编程  | 我要评论

鱼趣网,珍珠长毛兔,陶瓷弯管

微信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:@"好的"];

}

}

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网