新版支付宝手机网站支付、支付宝pc支付、支付宝无密退款实现
2017-10-31 13:46
761 查看
前面我记录过老版本的支付以及退款,这次写的是新版本的支付和退款
还是那句话,先去看官方文档:https://openhome.alipay.com/developmentDocument.htm
和微信支付一样,用的是IJPay这个封装的jar,必须给大神点个赞,集成了微信支付宝支付,用的也是RSA2官方推荐的方式,给出接口调用即可
支付宝接口社区精华帖集锦-接口样例、常见问题:https://openclub.alipay.com/read.php?tid=2019&fid=25 这个很不错,很多问题都得到了解决
首先拿到支付宝相关信息,
2、如果无法引入maven库中可以直接放到项目libs中,然后通过如下方式引用到
当然如果maven库中有合适的sdk也可以直接引入
引入IJPay
将appId,privateKey(应用私匙),publicKey(支付宝公匙,注意是支付宝公钥),serverUrl(网关)配置好
请求wapPay.do就能调起支付宝支付,效果如下
访问pcPay.do就会跳转到支付页面
传入订单号和商户订单号,访问tradeRefund.do直接退款成功,这里return可以返回你自己的路径,AlipayApi.tradeRefund(model)写前面去
上面直接返回即可
相关链接:http://blog.csdn.net/zyw_java/article/details/71970972
还是那句话,先去看官方文档: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") @ResponseBody public 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") @ResponseBody public 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") @ResponseBody public 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 验证失败"); // TODO return "failure"; } } catch (AlipayApiException e) { e.printStackTrace(); return "failure"; } }
上面直接返回即可
notify_url异步通知处理业务,给支付宝返回success,如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,
去重一定要注意,当初我就坑了。。。支付一次业务处理好几次
去重方法:方案1、入库字段设置为唯一,
方案2、有异步通知就通过订单查库判断是否存在
@RequestMapping(value = "/notify_url.do") @ResponseBody public 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 验证失败"); // TODO return "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即时到账和手机网站支付同步
- ASP.NET Core 2.0 使用支付宝PC网站支付实现代码(转)
- ASP.NET Core 2.0 使用支付宝PC网站支付实现代码
- 支付宝手机网站支付流程(Node实现)
- tp3.2 实现新支付宝支付接口 (手机网站支付)
- java支付宝支付,支付手机支付,pc网站支付
- java支付宝支付,支付手机支付,pc网站支付
- 支付宝pc端支付接入PHP实现
- 支付宝 手机网站支付
- 支付宝支付之手机网站支付
- [支付宝]手机网站支付快速接入
- 支付宝——手机网站支付接口研究
- 支付宝手机网站支付
- ASP.NET Core 2.0 使用支付宝PC网站支付
- 支付宝集成+网站支付+APP支付+手机网站支付
- 新版支付宝开放平台 手机网页支付 整个流程
- 支付宝手机网站支付私钥公钥生成(window环境)
- 支付--支付宝手机网站支付(WAP)
- 微信公众号中调用支付宝手机网站支付
- ASP.NET Core 2.0 使用支付宝PC网站支付