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

0.介绍预览

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

1.资料准备

1.1 账号注册

打开https://open.weixin.qq.com,注册微信开放平台开发者账号

1.2 开发者认证

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

1.3 注册应用

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

2.Java后台开发

添加依赖

<!-- 微信支付依赖 -->
<dependency>
 <groupId>org.xmlpull</groupId>
 <artifactId>xmlpull</artifactId>
 <version>1.1.3.1 </version>
</dependency>
<dependency>
 <groupId>net.sf.json-lib</groupId>
 <artifactId>json-lib</artifactId>
 <version>2.3</version>
 <classifier>jdk15</classifier>
</dependency>
<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
 <groupId>com.thoughtworks.xstream</groupId>
 <artifactId>xstream</artifactId>
 <version>1.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.ning/async-http-client -->
<dependency>
 <groupId>com.ning</groupId>
 <artifactId>async-http-client</artifactId>
 <version>1.8.13</version>
</dependency>

生成统一订单

@RequestMapping(value="/pay/wxpay/params",produces="application/json;charset=utf-8")
 @ResponseBody
 public String signprams(HttpServletRequest request){
  String res = "{code:404}";
  try{
  // 充值金额
   String account = request.getParameter("account");
  // 用户id
   String sid = request.getParameter("sid");
   String subject = "订单标题";
   String body = "订单描述";

   int acc = (int) (Double.valueOf(account) * 100);
   String appid = "您的APPID";
   String out_trade_no = "生成您的订单号";
  // 生成订单数据
   SortedMap<String, String> payMap = 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 (Exception e){
   e.printStackTrace();
   res = "{code:500}";
  }
  return res;
 }

 private SortedMap<String, String> genOrderData(HttpServletRequest request, String subject, String body,
          int acc, String appid, String out_trade_no)
   throws IOException, ExecutionException, InterruptedException, XmlPullParserException {
  SortedMap<String, String> paraMap = new TreeMap<String, String>();
  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", "http://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");
  String sign = createSign(paraMap);
  paraMap.put("sign", sign);
  // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
  String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
  String xml = getRequestXml(paraMap);
  String xmlStr = HttpKit.post(url, xml);

  // 预付商品id
  String prepay_id = "";
  if (xmlStr.indexOf("SUCCESS") != -1) {
   Map<String, String> map = WXRequestUtil.doXMLParse(xmlStr);
   prepay_id = (String) map.get("prepay_id");
  }

  SortedMap<String, String> payMap = new TreeMap<String, String>();
  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());
  String paySign = createSign(payMap);
  payMap.put("paySign", paySign);
  return payMap;
 }

 //请求xml组装
 public static String getRequestXml(SortedMap<String,String> parameters){
  String sign = "";
   StringBuffer sb = new StringBuffer();
   sb.append("<xml>");
   Set es = parameters.entrySet();
   Iterator it = es.iterator();
   while(it.hasNext()) {
    Map.Entry entry = (Map.Entry)it.next();
    String key = (String)entry.getKey();
    String value = (String)entry.getValue();
//    if ("attach".equalsIgnoreCase(key)||"body".equalsIgnoreCase(key)||"sign".equalsIgnoreCase(key)) {
//     sb.append("<"+key+">"+value+"</"+key+">");
//    }
    if ("sign".equalsIgnoreCase(key)){
    sign = "<"+key+">"+value+"</"+key+">";
    }else {
     sb.append("<"+key+">"+value+"</"+key+">");
    }
   }
   sb.append(sign);
   sb.append("</xml>");
   return sb.toString();
  } 

 //生成签名
 public String createSign(SortedMap<String,String> parameters){
   StringBuffer sb = new StringBuffer();
   Set es = parameters.entrySet();
   Iterator it = es.iterator();
   while(it.hasNext()) {
    Map.Entry entry = (Map.Entry)it.next();
    String k = (String)entry.getKey();
    Object v = 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());
   String sign = MD5Utils.MD5Encode(sb.toString(),"UTF-8").toUpperCase();
   return sign;
  } 

 public String create_nonce_str() {
 String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 String res = "";
 for (int i = 0; i < 32; i++) {
 Random rd = new Random();
 res += chars.charAt(rd.nextInt(chars.length() - 1));
 }
 return res;
 }

3.IOS客户端开发

导入微信开发包

添加URL Types

在AppDelegate.m中注册应用

#import "AppDelegate.h"
#import "XSTabBarViewController.h"
#import <AlipaySDK/AlipaySDK.h>
#import "WXApi.h"

@interface AppDelegate ()<WXApiDelegate>

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 // Override point for customization after application launch.

// [NSThread sleepForTimeInterval:2.0];

 // 进入主控制器
 self.window = [[UIWindow alloc] init];
 self.window.frame = [UIScreen mainScreen].bounds;
 self.window.rootViewController = [[XSTabBarViewController alloc] init];

 [self.window makeKeyAndVisible];

 //向微信注册应用。
 [WXApi registerApp:@"wxfb96c2a9b531be26"];

 return YES;
}

-(void) onResp:(BaseResp*)resp
{
//  NSLog(@" ----onResp %@",resp);
 /*
  ErrCode ERR_OK = 0(用户同意)
  ERR_AUTH_DENIED = -4(用户拒绝授权)
  ERR_USER_CANCEL = -2(用户取消)
  code 用户换取access_token的code,仅在ErrCode为0时有效
  state 第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K
  lang 微信客户端当前语言
  country 微信用户当前国家信息
  */
 if ([resp isKindOfClass:[SendAuthResp class]]) //判断是否为授权请求,否则与微信支付等功能发生冲突
 {
  SendAuthResp *aresp = (SendAuthResp *)resp;
  if (aresp.errCode== 0)
  {
   //   NSLog(@"code %@",aresp.code);
   [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}];
  }
 }else{ // 支付请求回调
  //支付返回结果,实际支付结果需要去微信服务器端查询
  NSString *strMsg = [NSString stringWithFormat:@"支付结果"];
  NSString *respcode = @"0";
  switch (resp.errCode) {
   case WXSuccess:
    strMsg = @"支付结果:成功!";
    //    NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);
    respcode = @"1";
    break;
   default:
    strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
    //    NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
    respcode = @"0";
    break;
  }
  [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidPayNotification" object:self userInfo:@{@"respcode":respcode}];
 }
}

//iOS 9.0 之前的处理方法不保证正确,如有错误还望指正
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
 NSLog(@"iOS 9.0 之前");
 return [self applicationOpenURL:url];
}

-(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
 NSLog(@"iOS 9.0 之后");
 return [self applicationOpenURL:url];
}

- (BOOL)applicationOpenURL:(NSURL *)url
{
 if([[url absoluteString] rangeOfString:@"wxfb96c2a9b531be26://pay"].location == 0){
  return [WXApi handleOpenURL:url delegate:self];
 }
 if ([url.host isEqualToString:@"safepay"])
 {
  [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:nil];
  return YES;
 }
 return YES;
}

}

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

- (void)viewDidLoad {
 [super viewDidLoad];

 // 接受微信支付通知
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wechatDidPayNotification:) name:@"wechatDidPayNotification" object:nil];
}

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

-(void)weixinPay
{
 NSString *userUrlStr = [NSString stringWithFormat:@"%@?sid=%@&account=%@&desc=%@", WX_PREPAY_URL, self.student.sid,self.payJinE,self.student.nid];
 NSURL *url = [NSURL URLWithString:userUrlStr];
//  NSLog(@"userUrlStr = %@", userUrlStr);

 NSURLRequest *request = [NSURLRequest requestWithURL:url];
 AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];

 [MBProgressHUD showMessage:@"跳转中,请稍候"];
 [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
  [MBProgressHUD hideHUD];

//   NSLog(@"微信支付的response = %@", operation.responseString);
  NSData *JSONData = [operation.responseString dataUsingEncoding:NSUTF8StringEncoding];
  NSDictionary *userDict = [NSJSONSerialization JSONObjectWithData:JSONData options:NSJSONReadingMutableLeaves error:nil];

  // 调用微信支付
  PayReq *request = [[PayReq alloc] init];
  /** 商家向财付通申请的商家id */
  request.partnerId = [userDict objectForKey:@"partnerid"];
  /** 预支付订单 */
  request.prepayId= [userDict objectForKey:@"prepayid"];
  /** 商家根据财付通文档填写的数据和签名 */
  request.package = [userDict objectForKey:@"package"];
  /** 随机串,防重发 */
  request.nonceStr= [userDict objectForKey:@"noncestr"];
  /** 时间戳,防重发 */
  request.timeStamp= [[userDict objectForKey:@"timestamp"] intValue];
  /** 商家根据微信开放平台文档对数据做的签名 */
  request.sign= [userDict objectForKey:@"sign"];
  self.sign = request.sign;
  self.ordnum = [userDict objectForKey:@"ordnum"];

  [WXApi sendReq: request];
 }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  [MBProgressHUD hideHUD];
  NSLog(@"发生错误!%@",error);
 }];
 NSOperationQueue *queue = [[NSOperationQueue alloc] init];
 [queue addOperation:operation];

}
// 微信支付结果
-(void)wechatDidPayNotification:(NSNotification *)notification
{
// NSLog(@"wechatDidPayNotification");
 NSDictionary *nameDictionary = [notification userInfo];
 NSString *respcode = [nameDictionary objectForKey:@"respcode"];
 if([respcode isEqualToString:@"1"]){
  // 支付成功,更新用户信息
  [self payDidFinish];
 }else{
  // 支付失败,
  [self setupAlertControllerWithTitle:@"微信支付结果" messge:@"本次支付未完成,您可以稍后重试!" confirm:@"好的"];
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 微信APP支付Java代码

    本文实例为大家分享了java微信APP支付代码,供大家参考,具体内容如下 import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Random; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.htt

  • java实现微信App支付服务端

    微信App支付服务端的实现方法,供大家参考,具体内容如下 引言 主要实现app支付统一下单.异步通知.调起支付接口.支付订单查询.申请退款.查询退款功能:封装了https对发起退款的证书校验.签名.xml解析等. 支付流程 具体支付流程参考"微信APP"文档,文档地址 APP支付:APP端点击下单--服务端生成订单,并调起"统一下单",返回app支付所需参数-–APP端"调起支付接口",发起支付--微信服务器端调用服务端回调地址-–服务端按照&q

  • java服务端微信APP支付接口详解

    一.微信APP支付接入商户服务中心 [申请流程指引] (https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=84f23b4e9746c5963128711f225476cfd49ccf8c&lang=zh_CN) 二.开始开发 1.配置相关的配置信息 1.1.配置appid(Androi

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

    0.介绍预览 针对需要在IOS手机上接入原生微信支付场景,调用微信进行支付.如图: 1.资料准备 1.1 账号注册 打开https://open.weixin.qq.com,注册微信开放平台开发者账号 1.2 开发者认证 登录,进入账号中心,进行开发者资质认证. 1.3 注册应用 认证完成后,进入管理中心,新建移动应用.填写应用资料,其中android版应用签名可通过扫码安装温馨提供的应用获得,详细参考微信文档.创建完成后点击查看,申请开通微信支付.一切准备就绪! 2.Java后台开发 添加依赖

  • 支付宝APP支付(IOS手机端+java后台)版

    0.介绍预览 针对需要在IOS手机上接入原生微信支付场景,调用微信进行支付.如图: 1.资料准备 1.1 账号注册 打开https://openhome.alipay.com,注册支付宝开放平台开发者账号 1.2 开发者认证 登录,进入开发者中心,进行开发者资质认证,并创建移动应用. 1.3 签约应用 创建应用后上传相关资料,上线应用并通过审核.审核通过后点击应用,进行签约,此步骤不能省略,否则或报ISV权限不足. 1.4 应用配置 打开应用信息,配置一下内容,接口签名可下载支付宝签名验签工具进

  • Android开发微信APP支付功能的要点小结

    基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置. 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置. 调试阶段,签名文件可以使用调试用的debug.keystore,签名可以直接在eclipse上面查看,或者用工具查看 ,安装打开输入包名即可查看. 发布的时候一定需要在微信支付平台上面设置成发布用的签名值. 官方的Demo里面的内容并不是全是必须的,甚至只需要有libammsdk.jar就够了,AndroidMani

  • springboot接入微信app支付的方法

    1.前戏 1.1请先完成微信APP支付接入商户服务中心 1.2详情请参考微信官方文档:https://open.weixin.qq.com/ 2.application.yml文件的配置如下 #微信支付配置 tenpayconfig: #商户APPID appId: asdfg12345 #商户号 mchId: 12345678 #商户的key(API密匙) key: qwertyuiop #API支付请求地址 payUrl: https://api.mch.weixin.qq.com/pay/

  • PHP实现的微信APP支付功能示例【基于TP5框架】

    本文实例讲述了PHP实现的微信APP支付功能.分享给大家供大家参考,具体如下: 1.进行支付请求 他给的DEMO 用的时候有时候会报错 1)我遇到的情况 把  WxPay.Api.php这个文件的 postXmlCurl 这个 方法里 // curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); // curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验 curl_setopt($ch,CURLOPT_SSL_VER

  • ASP.Net项目中实现微信APP支付功能

    最近挺忙的,没时间写东西.然后在弄微信APP支付,网上的搜索一趟,都比较凌乱,我也遇到一些坑,不过也算弄好了,记录分享一下. 1.准备各种调用接口需要的参数,配置app.config. <!--AppID--> <add key="AppID" value="" /> <!--AppSecret--> <add key="AppSecret" value="" /> <!-

  • 微信小程序实现手写签名(签字版)

    本文实例为大家分享了微信小程序实现手写签名的具体代码,供大家参考,具体内容如下 公司近期有个需要用户签名的功能,就用小程序canvas写了个 wxml <view class="sign">   <view class="paper">     <canvas class="handWriting" disable-scroll="true" bindtouchstart="touchs

随机推荐