前面我记录过老版本的支付以及退款,这次写的是新版本的支付和退款

还是那句话,先去看官方文档:https://openhome.alipay.com/developmentDocument.htm

和微信支付一样,用的是IJPay这个封装的jar,必须给大神点个赞,集成了微信支付宝支付,用的也是RSA2官方推荐的方式,给出接口调用即可

支付宝接口社区精华帖集锦-接口样例、常见问题:https://openclub.alipay.com/read.php?tid=2019&fid=25        这个很不错,很多问题都得到了解决

首先拿到支付宝相关信息,

appId,privateKey,publicKey
appId不是PID(2088xxxxxxxx),而是在开发者中心-我的应用里:比如:2016111201740164
生成应用公匙和应用私匙,记着RSA2是2048位的,生成方式上面链接有
将应用公匙上传到平台上,支付宝会返回一个支付宝公匙,复制下来备用
下好官方sdk,引入alipay-sdk-java2017xxxxxxxx.jar有两种方式
1、手动打入maven库然后引用
举例:mvn install:install-file -DgroupId=com.alipay -DartifactId=alipay-sdk -Dpackaging=jar -Dversion=java20170829142630 -Dfile=alipay-sdk-java20170829142630.jar -Dsources=alipay-sdk-java20170829142630-source.jar
引用:
<dependency><groupId>com.alipay</groupId><artifactId>alipay-sdk</artifactId><version>java20170829142630</version></dependency>

2、如果无法引入maven库中可以直接放到项目libs中,然后通过如下方式引用到

<dependency><groupId>com.alibaba</groupId><artifactId>alipay-sdk-java</artifactId><version>java20170829142630</version><scope>system</scope><systemPath>${project.basedir}/libs/alipay-sdk-java20170829142630.jar</systemPath></dependency>

当然如果maven库中有合适的sdk也可以直接引入

引入IJPay

<dependency><groupId>com.github.javen205</groupId><artifactId>IJPay</artifactId><version>0.8</version>
</dependency>
将appId,privateKey(应用私匙),publicKey(支付宝公匙,注意是支付宝公钥),serverUrl(网关)配置好
public AliPayApiConfig getApiConfig(){return AliPayApiConfig.New().setAppId(appId).setAlipayPublicKey(publicKey).setCharset("UTF-8").setPrivateKey(privateKey).setServiceUrl(serverUrl).setSignType("RSA2").build();}

支付宝wap支付

/*支付宝浏览器支付,已测试*/@RequestMapping(value = "/wapPay.do")public void wapPay(HttpServletResponse response) throws IOException {System.out.println("--------------------wap pay------------------------");String body = "我是测试数据";String subject = "77";String totalAmount = "1";String passbackParams = "1";String returnUrl = "http://xxx/alipay/return_url";String notifyUrl = "http://xxx/alipay/notify_url";        AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();   model.setBody(body);model.setSubject(subject);model.setTotalAmount(totalAmount);//model.setPassbackParams(passbackParams);  String outTradeNo = StringUtils.getOutTradeNo();System.out.println("wap outTradeNo---->"+outTradeNo);model.setOutTradeNo(outTradeNo);model.setProductCode("QUICK_WAP_PAY");        try {       AliPayApiConfigKit.putApiConfig(getApiConfig());//这个不能缺AliPayApi.wapPay(response, model, returnUrl, notifyUrl);     } catch (Exception e) {e.printStackTrace();}}

请求wapPay.do就能调起支付宝支付,效果如下

pc支付
/*** PC支付 成功*/@RequestMapping(value = "/pcPay.do")@ResponseBodypublic void pcPay(HttpServletResponse response){try {String totalAmount = "0.1";String outTradeNo =StringUtils.getOutTradeNo();String returnUrl = "http://xxx/alipay/return_url";String notifyUrl = "http://xxx/alipay/notify_url";AlipayTradePayModel model = new AlipayTradePayModel();model.setOutTradeNo(outTradeNo);model.setProductCode("FAST_INSTANT_TRADE_PAY");model.setTotalAmount(totalAmount);model.setSubject("PC支付测试");model.setBody("我是20万");AliPayApiConfigKit.putApiConfig(getApiConfig());AliPayApi.tradePage(response,model , notifyUrl, returnUrl);} catch (Exception e) {e.printStackTrace();}}

访问pcPay.do就会跳转到支付页面

支付成功后都要保存订单号和商户订单号,待退款有用
无密退款
/*** 退款 成功  无密退款*/@RequestMapping(value = "/tradeRefund.do")@ResponseBodypublic String tradeRefund() {try {AlipayTradeRefundModel model = new AlipayTradeRefundModel();
//       model.setOutTradeNo("042517111114931");
//       model.setTradeNo("2017042521001004200200236813");model.setOutTradeNo("10311418115094");model.setTradeNo("201710312100104740246541100");model.setRefundAmount("0.10");model.setRefundReason("正常退款");AliPayApiConfigKit.putApiConfig(getApiConfig());System.out.println("refund");return AliPayApi.tradeRefund(model);} catch (AlipayApiException e) {e.printStackTrace();}return null;}

传入订单号和商户订单号,访问tradeRefund.do直接退款成功,这里return可以返回你自己的路径,AlipayApi.tradeRefund(model)写前面去

返回的数据是:
@RequestMapping(value = "/return_url.do")@ResponseBodypublic String return_url(HttpServletRequest request) {try {// 获取支付宝GET过来反馈信息Map<String, String> map = AliPayApi.toMap(request);for (Map.Entry<String, String> entry : map.entrySet()) {System.out.println(entry.getKey() + " = " + entry.getValue());}boolean verify_result = AlipaySignature.rsaCheckV1(map, publicKey, "UTF-8","RSA2");if (verify_result) {// 验证成功// TODO 请在这里加上商户的业务逻辑程序代码System.out.println("return_url 验证成功");return "success";} else {System.out.println("return_url 验证失败");// TODOreturn "failure";}} catch (AlipayApiException e) {e.printStackTrace();return "failure";}}

上面直接返回即可

notify_url异步通知处理业务,给支付宝返回success,如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,
去重一定要注意,当初我就坑了。。。支付一次业务处理好几次
去重方法:方案1、入库字段设置为唯一,
     方案2、有异步通知就通过订单查库判断是否存在
@RequestMapping(value = "/notify_url.do")@ResponseBodypublic String  notify_url(HttpServletRequest request) throws UnsupportedEncodingException {try {// 获取支付宝POST过来反馈信息Map<String, String> params = AliPayApi.toMap(request);for (Map.Entry<String, String> entry : params.entrySet()) {System.out.println(entry.getKey() + " = " + entry.getValue());}//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");boolean verify_result = AlipaySignature.rsaCheckV1(params,publicKey, "UTF-8","RSA2");if (verify_result) {// 验证成功if(trade_status.equals("TRADE_FINISHED") || trade_status.equals("TRADE_SUCCESS")){// TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理System.out.println("notify_url 验证成功succcess");return "success";}} else {System.out.println("notify_url 验证失败");// TODOreturn "failure";}} catch (AlipayApiException e) {e.printStackTrace();return "failure";}return "fail";}
我的demo:https://download.csdn.net/download/goligory/10048415

相关链接:http://blog.csdn.net/zyw_java/article/details/71970972

新版支付宝手机网站支付、支付宝pc支付、支付宝无密退款实现相关推荐

  1. 记录支付宝手机网站(WAP)支付踩过的坑

    由于苹果审核机制变化,除了JSPatch等热修复的应用受到影响外,另个影响较大的就是非法集成第三方支付SDK(尤其支付宝)而审核被拒.但是由于你懂的的原因,不想走IAP(In App Pay),所以当 ...

  2. Magento支付宝手机网站支付插件V6.0旗舰版发布,支持在微信中使用支付宝支付,订单重新支付功能!...

    2019独角兽企业重金招聘Python工程师标准>>> 功能 严格按照支付宝接口文档编写代码. 支付宝异步通知机制,确保订单状态及时更新,无丢失遗漏. 订单完美对接:支付后即使关掉支 ...

  3. 支付宝手机网站支付实战踩坑

    准备 需求 需求就是最简单的对接支付宝支付接口 方案心路历程 简单用http对接一下,不过想了一下觉得第三方提供的SDK总是不用,所以打算尝试一下 支付宝新版SDK,从文档到git再安装到使用,然后放 ...

  4. Laravel 集成支付宝手机网站支付

    前期准备: 1.下载SDK,里面还有Demo,可以参照Demo里面的内容快速接入 支付宝 手机网站支付SDK&Demo 2.把下载的zip文件解压,放到项目目录里,这里作者放在app文件夹里, ...

  5. PHP接入支付宝手机网站支付、移动支付接口

    payment 项目2.0版本 前面已经说完了 PHP接入支付宝 即时到帐接口 回调接口也已经完成.这篇主要讲 手机网站支付 . 移动支付 接口的调用.调用方式与即时到帐 基本一样. 关于代码部分的详 ...

  6. php手机网站支付宝_PHP实现支付宝手机网站支付功能

    PHP实现支付宝手机网站支付功能的方法:首先开通支付宝商家中心里面的手机网站支付:然后进入开发者中心,获取到APPID:接着去文档中心下载"DEMO":最后将"demo& ...

  7. 支付宝手机网站支付出现系统繁忙,请稍后再试

    今日在做一个文件搞定支付宝系列时,其中在做支付宝手机网站兼容微信浏览器时,遇到了不少坑,这里详细记录一下. 1.验签出错 按照支付宝提供的demo(alipay_in_weixin_demo),里面只 ...

  8. 支付宝手机网站支付补全信息提示 系统综合评估签约条件不满足解决

    申请支付宝 手机网站支付 成功后需补全经营信息,但是补全提交时提示  "系统综合评估签约条件不满足解决",需要检查下自己的支付宝账号是否满足以下申请条件: 1.申请前必须拥有经过实 ...

  9. 支付--支付宝手机网站支付(WAP)

    介绍: 这是放在微信供公众号内的一个项目,支付模块设计到微信公众号支付和支付宝手机网站支付,这次把支付宝手机网站支付整理下来. 文档: 支付宝手机网站支付的开发文档: https://docs.ope ...

最新文章

  1. oracle触发器 条件,oracle触发器的定义和使用
  2. ScheduledThreadPoolExecutor()定时执行线程池详解,java线程池
  3. 【Web安全】中国蚁剑+DVWA(本地文件上传漏洞Upload)
  4. winsock 错误
  5. android—获取网络数据
  6. aes256加密java_使用Java和JCEKS进行AES-256加密
  7. OSGL 工具库 - 类型转换的艺术
  8. 【pytorch】常见的坑汇总
  9. 双非本科:337家Java后台面试总结
  10. EasyUI后台管理系统
  11. 泛型编程基础知识详解
  12. OpenGL 纹理映射(贴图) 学习
  13. 批量将一个 PDF 文件按固定页数拆分成多个小的 PDF 文件
  14. 美国佐治亚理工学院计算机博士,大神offer | 恭喜G同学全奖录取佐治亚理工学院-数学博士!...
  15. 测序数据量,测序深度和测序覆盖度
  16. 题解:Rikka with Parenthesis II(HDU-5831)
  17. 银河战舰的最后一门重炮──C罗
  18. 使用webgl(three.js)搭建3D智慧园区、3D大屏,3D楼宇,智慧灯杆三维展示,3D灯杆,web版3D,bim管理系统——第六课...
  19. 转载---about Amazon EC2
  20. SpringBoot实现登录注册

热门文章

  1. 各位好友,中秋节快乐
  2. [UBUNTU]挖矿病毒处理
  3. 梦想CAD控件(网页CAD插件) 2022.12.12更新
  4. 如何禁用和恢复任务管理器
  5. vue-cli + APIcloud
  6. 武汉光迅科技Java笔试题
  7. iOS怎么制作PDF图片和网络抓取图片
  8. 中投公司副总经理谢平:互联网金融风险更低
  9. 文本编辑器EmEditor快捷键指令
  10. java指定若干个网络图片,打包为zip下载