鱼趣网,珍珠长毛兔,陶瓷弯管
针对需要在IOS手机上接入原生微信支付场景,调用微信进行支付。如图:
登录,进入账号中心,进行开发者资质认证。
认证完成后,进入管理中心,新建移动应用。填写应用资料,其中android版应用签名可通过扫码安装温馨提供的应用获得,详细参考微信文档。创建完成后点击查看,申请开通微信支付。一切准备就绪!
添加依赖
[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 使用UITextField自定义搜索框 实现用户输入完之后“实时搜索”功能
网友评论