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

 更新时间:2019年05月05日 09:22:09   作者:只要你能好  
这篇文章主要为大家详细介绍了支付宝APP支付(IOS手机端+java后台)版,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

0.介绍预览

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

1.资料准备

1.1 账号注册

打开https://openhome.alipay.com,注册支付宝开放平台开发者账号

1.2 开发者认证

登录,进入开发者中心,进行开发者资质认证,并创建移动应用。

1.3 签约应用

创建应用后上传相关资料,上线应用并通过审核。审核通过后点击应用,进行签约,此步骤不能省略,否则或报ISV权限不足。

1.4 应用配置

打开应用信息,配置一下内容,接口签名可下载支付宝签名验签工具进行生成,生成完成后将公钥复制到平台上。

2.Java后台开发

添加依赖

<!-- 支付宝支付依赖 -->
<dependency>
 <groupId>com.pentahohub.nexus</groupId>
 <artifactId>alipay-sdk-java</artifactId>
 <version>20170615110434</version>
 <scope>system</scope>
 <systemPath>${basedir}/libs/alipay-sdk-java20170615110434.jar</systemPath>
</dependency>
<dependency>
 <groupId>commons-logging</groupId>
 <artifactId>commons-logging</artifactId>
 <version>1.1.1</version>
</dependency>

生成统一订单

/**
* account 总金额
* sid 用户id
* desc 节点id
* @param request
* @return
*/
@RequestMapping(value="/pay/alipay/signprams",produces="application/json;charset=utf-8")
@ResponseBody
public String signprams(HttpServletRequest request){
String res = "{code:404}";
try{
 String totalAmount = request.getParameter("account");
 String sid = request.getParameter("sid");
 String nid = request.getParameter("desc");
 String subject = "电费充值";
 String body = "贵大电费预付费充值";
 String prefix = "ALE"+sid+"E";
 String out_trade_no = WXRequestUtil.getTradeNo(prefix);
 
 //实例化客户端
 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do 
",
 AlipayUtil.APPID, AlipayUtil.PRIVATE_KEY, "json", AlipayUtil.CHARSET, AlipayUtil.PUBLIC_KEY, "RSA2");
 //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
 AlipayTradeAppPayRequest alirequest = new AlipayTradeAppPayRequest();
 //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
 AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
 model.setPassbackParams(URLEncoder.encode(body.toString()));; //描述信息 添加附加数据
 model.setSubject(subject); //商品标题
 model.setOutTradeNo(out_trade_no); //商家订单编号
 model.setTimeoutExpress("30m"); //超时关闭该订单时间
 model.setTotalAmount(totalAmount); //订单总金额
 model.setProductCode("QUICK_MSECURITY_PAY"); //销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
 alirequest.setBizModel(model);
 alirequest.setNotifyUrl("http://pay.gzdxfszx.com/pay/alipay/notify.xs 
"); //回调地址
 String orderStr = "";
 try {
 //这里和普通的接口调用不同,使用的是sdkExecute
 AlipayTradeAppPayResponse response = alipayClient.sdkExecute(alirequest);
 orderStr = response.getBody();
//  System.out.println(orderStr);//就是orderString 可以直接给客户端请求,无需再做处理。
 } catch (AlipayApiException e) {
 e.printStackTrace();
 }
 
 String sign = MD5Encode.encode(out_trade_no);
 savePayLog(out_trade_no,totalAmount,sid,body, sign,nid,1);
 
 JSONObject resObj = new JSONObject();
 resObj.put("code",ResponseCode.HTTP_SUCCESS);
 resObj.put("out_trade_no",out_trade_no);
 resObj.put("sign",sign);
 resObj.put("orderStr",orderStr);
 
 res = resObj.toJSONString();
}catch (Exception e){
 e.printStackTrace();
}
return res;
}

异步通知处理

@RequestMapping(value="/pay/alipay/notify",produces="application/json;charset=utf-8")
 @ResponseBody
 public String notify(HttpServletRequest request){
 Map requestParams = request.getParameterMap();
 System.out.println("支付宝支付结果通知"+requestParams.toString());
 //获取支付宝POST过来反馈信息
 Map<String,String> params = new HashMap<String,String>();
 
 for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
  String name = (String) iter.next();
  String[] values = (String[]) requestParams.get(name);
  String valueStr = "";
  for (int i = 0; i < values.length; i++) {
  valueStr = (i == values.length - 1) ? valueStr + values[i]
   : valueStr + values[i] + ",";
  }
  //乱码解决,这段代码在出现乱码时使用。
  //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
  params.put(name, valueStr);
 }
 //切记alipaypublickey是支付宝的公钥,请去open.alipay.com 
 
对应应用下查看。
 //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
 try {
  //验证签名
  boolean flag = AlipaySignature.rsaCheckV1(params, AlipayUtil.PUBLIC_KEY, AlipayUtil.CHARSET, "RSA2");
  if(flag){
  if("TRADE_SUCCESS".equals(params.get("trade_status"))){
//   //付款金额
//   String amount = params.get("buyer_pay_amount");
//   //支付宝交易号
//   String trade_no = params.get("trade_no");
//   //附加数据
//   String passback_params = URLDecoder.decode(params.get("passback_params"));
 
   //商户订单号
   String out_trade_no = params.get("out_trade_no");
   updateOrderInfo(out_trade_no,MD5Encode.encode(out_trade_no));
  }
  }
 } catch (AlipayApiException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 return "success";
 }

3.IOS客户端开发

导入支付宝开发包

添加URL Types

在需要调用支付宝的地方实现方法

-(void)aliPay
{
 [MBProgressHUD showMessage:@"跳转中,请稍候"];
 NSString *appScheme = @"alisdkdemo";
 
 NSString *userUrlStr = [NSString stringWithFormat:@"%@?sid=%@&account=%@&desc=%@", ALI_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];
 
 [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];
 
 NSString *orderString = [userDict objectForKey:@"orderStr"];
 self.sign = [userDict objectForKey:@"sign"];
 self.ordnum = [userDict objectForKey:@"out_trade_no"];
 
 [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
  NSLog(@"reslut = %@",resultDic);
  [MBProgressHUD hideHUD];
  
  NSString *resultStatus = [resultDic objectForKey:@"resultStatus"];
  if([resultStatus isEqualToString:@"9000"]){
  // 支付成功,更新用户信息
  [self payDidFinish];
  }else{
  // 支付失败,
  [self setupAlertControllerWithTitle:@"支付宝支付结果" messge:@"本次支付未完成,您可以稍后重试!" confirm:@"好的"];
  }
  
 }];
 }failure:^(AFHTTPRequestOperation *operation, NSError *error) {
 [MBProgressHUD hideHUD];
 NSLog(@"发生错误!%@",error);
 }];
 NSOperationQueue *queue = [[NSOperationQueue alloc] init];
 [queue addOperation:operation];
 
 
 
}

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

相关文章

  • SpringBoot Mybatis如何配置多数据源并分包

    SpringBoot Mybatis如何配置多数据源并分包

    这篇文章主要介绍了SpringBoot Mybatis如何配置多数据源并分包,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • java策略枚举:消除在项目里大批量使用if-else的优雅姿势

    java策略枚举:消除在项目里大批量使用if-else的优雅姿势

    这篇文章主要给大家介绍了关于Java彻底消灭if-else的8种方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2021-06-06
  • Java项目Guava包 HashMultimap使用及注意事项

    Java项目Guava包 HashMultimap使用及注意事项

    guava基本上可以说是java开发项目中,大概率会引入的包,今天介绍的主角是一个特殊的容器HashMultmap,可以简单的将它的数据结构理解为Map<K, Set<V>>,今天主要介绍下基础的知识点 HashMultmap级使用,感兴趣的朋友一起看看吧
    2022-05-05
  • springboot使用Thymeleaf报错常见的几种解决方案

    springboot使用Thymeleaf报错常见的几种解决方案

    这篇文章主要介绍了springboot使用Thymeleaf报错常见的几种解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 分析Java设计模式之组合模式

    分析Java设计模式之组合模式

    组合模式是一种对象的行为模式。将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。它的本质是统一叶子对象和组合对象。它的目的是让客户端不再区分操作的是组合对象还是叶子对象,而是以一个统一的方式来操作
    2021-06-06
  • Java命令行下Jar包打包小结

    Java命令行下Jar包打包小结

    这篇文章主要介绍了Java命令行下Jar包打包小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • spring cloud实现Eureka注册中心的HA的方法

    spring cloud实现Eureka注册中心的HA的方法

    本篇文章主要介绍了spring cloud实现Eureka注册中心的HA的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • java数据结构基础:单,双向链表

    java数据结构基础:单,双向链表

    这篇文章主要介绍了Java的数据解构基础,希望对广大的程序爱好者有所帮助,同时祝大家有一个好成绩,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • 浅谈SpringCloud的微服务架构组件

    浅谈SpringCloud的微服务架构组件

    这篇文章主要介绍了浅谈SpringCloud的微服务架构组件,Spring Cloud根据分布式服务协调治理的需求成立了许多子项目,每个项目通过特定的组件去实现,需要的朋友可以参考下
    2023-04-04
  • java使用MulticastSocket实现多点广播

    java使用MulticastSocket实现多点广播

    这篇文章主要为大家详细介绍了java使用MulticastSocket实现多点广播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论