2019独角兽企业重金招聘Python工程师标准>>>

对接支付宝支付的前提:

1,商户开通支付能力

登录蚂蚁金服 开放平台:https://open.alipay.com/platform/home.htm

需要开通 的功能选项有:

创建应用,类型是:网页&移动应用

设置应用的RSA 等各项参数,界面如下:

支付宝推荐使用RSA2 加密方式,老版的加密方式只有RSA 和md5,没有RSA2.

本项目使用RSA2 加密方式

2,对接支付宝依赖的jar包

 <!-- https://mvnrepository.com/artifact/net.guerlab/sdk-alipay-core --><dependency><groupId>net.guerlab</groupId><artifactId>sdk-alipay-core</artifactId><version>1.0.3</version></dependency>

我写了一个专门封装对接支付宝的Service 层

见代码:https://gitee.com/kunlunsoft/pay_service.git

项目结构:

发起支付 控制器(需根据实际情况修改):

下面的"/order/startPay"接口

package com.girltest.web.controller.pay;import com.common.annotation.NoLogin;
import com.common.bean.BaseResponseDto;
import com.common.dict.Constant2;
import com.common.util.RedisHelper;
import com.common.util.SystemHWUtil;
import com.girltest.dao.AlipayNotifySuccessDao;
import com.girltest.dao.BusinessOrderDao;
import com.girltest.entity.BusinessOrder;
import com.house.ujiayigou.thirdpart.alipay.config.AlipayConfig;
import com.house.ujiayigou.thirdpart.alipay.info.PayFormInfo;
import com.string.widget.util.RandomUtils;
import com.string.widget.util.ValueWidget;
import com.time.util.TimeHWUtil;
import com.yunmasoft.service.pay.AlipayNotifySuccessService;
import com.yunmasoft.service.pay.alipay.AliPayService;
import com.yunmasoft.service.pay.alipay.PayOperation;
import com.yunmasoft.service.pay.alipay.PayService;
import oa.entity.AlipayNotifySuccess;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.math.BigDecimal;
import java.util.Date;/*** Created by tonyjiang on 15/8/28.*/@Controller
public class PayOrderController {@Resource(name = "alipay")private AliPayService aliPayService;public static org.slf4j.Logger HttpClientRestLogger = LoggerFactory.getLogger("pay_log");//    @Resource
//    private OrderDetailViewModel orderDetailViewModel;@Resourceprivate AlipayNotifySuccessDao alipayNotifySuccessDao;@Resourceprivate AlipayNotifySuccessService alipayNotifySuccessService;@Resourceprivate BusinessOrderDao businessOrderDao;/**** 抹掉小数点后面的零头** @param orderPrice* @return*/private static String removeDecimalPoint(BigDecimal orderPrice) {String formatPrice = ValueWidget.formatBigDecimal(orderPrice);return formatPrice;}private static void checkOrderStatus(int orderStatus) {if (orderStatus == Constant2.ORDERSTATUS_PAID_ALREADY) {//支付完成,调到支付成功页
//            LogicBusinessException.throwException("alreadyPaid");} else if (orderStatus == Constant2.ORDERSTATUS_CANCELLED) {//已经取消了订单
//            LogicBusinessException.throwException("alreadyCancel");}}/**** 通过redis 获取订单的支付结果:是否支付成功* @param request* @param response* @param httpSession* @param model* @param orderNo* @return*/@RequestMapping("/order/payOrderResult")@ResponseBodypublic String getOrderPayResult(HttpServletRequest request, HttpServletResponse response, HttpSession httpSession, Model model,@RequestParam(value = "orderNo", required = true) String orderNo) {BaseResponseDto baseResponseDto = new BaseResponseDto(PayService.isPaySuccess(orderNo));return baseResponseDto.toJson();}/**** 下单页* @param model* @param request* @param response* @param release* @return*/@RequestMapping(value = "/order/place", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)public String json2(Model model, HttpServletRequest request, HttpServletResponse response, @RequestParam(required = false, defaultValue = "true") Boolean release) {String orderNo = "Xr20001" + RandomUtils.getNextInt();model.addAttribute("orderNo", orderNo);return "pay/wap/placeorder";}/**** 步骤:* 1,获取当前用户信息* 2,根据订单号查询订单详情* 3,校验订单状态和支付方式* 4,跳转到第三方支付* @param request* @param response* @param httpSession* @param model* @param orderNo* @param callback* @return* @throws Exception*/@RequestMapping("/order/startPay")@NoLoginpublic String startPay(HttpServletRequest request, HttpServletResponse response, HttpSession httpSession, Model model,@RequestParam(value = "orderNo", required = true) String orderNo,@RequestParam(value = "callback", required = false) String callback, BigDecimal shouldPay) throws Exception {//p判断该订单号是否已经存在AlipayNotifySuccess alipayNotifySuccess = this.alipayNotifySuccessService.getAlipayNotifySuccess(orderNo);if (null != alipayNotifySuccess) {model.addAttribute("errorMessage", "该订单号已经存在,orderNo:" + orderNo);return "pay/alipay";}// 判断订单号是否存在BusinessOrder businessOrder = this.businessOrderDao.get("orderNo", orderNo);if (null == businessOrder) {model.addAttribute("errorMessage", "该订单号不存在,orderNo:" + orderNo);return "pay/alipay";}
/*//保存订单businessOrder = new BusinessOrder();businessOrder.setOrderNo(orderNo);businessOrder.setTotalPrice(shouldPay);CreateTimeUtil.fillTime(businessOrder);this.businessOrderDao.add(businessOrder);*///获取当前用户信息//7.应付金额String strShouldPay = null;if (ValueWidget.isNullOrEmpty(shouldPay)) {shouldPay=businessOrder.getPrice();}strShouldPay = ValueWidget.formatBigDecimal(shouldPay);//8. 账户String sellerAccount = AlipayConfig.seller_email;//9.其它
//        RedisHelper.getInstance().saveKeyCache(PayService.REDIS_KEY_STORE_ORDER_PAY_TIME, orderNo, TimeHWUtil.formatDate(new Date(), TimeHWUtil.YYYYMMDD_NO_LINE));String orderName = businessOrder.getProductBaseInfo().getDisplayName();//10.com.house.ujiayigou.thirdpart.alipay.info.PayFormInfo payFormInfo = new PayFormInfo();payFormInfo.setOut_trade_no(orderNo);payFormInfo.setSubject(orderName);payFormInfo.setBody(orderName);payFormInfo.setTotal_amount(strShouldPay);payFormInfo.setSeller_id(sellerAccount);String form = aliPayService.preparePostRequest(payFormInfo);HttpClientRestLogger.error("form:" + form);model.addAttribute("form", form);return "pay/alipay";}/*** 1,获取订单;* 2,价格;* 3,Identify;* 4,第三方支付相关接口service;* 5,callback* 6,coupon* 7,应付金额* 8,账户* 9,其它* 10,** @param access_token* @param orderNo* @param payType* @param callback* @return*/public String postThirdPayAction(String access_token, String orderNo, String payType, String callback) {//订单/* OrderInfoBean orderInfo = orderBusiness.getOrderInfoByOrderNo(access_token, orderNo);if (orderInfo == null || orderInfo.getItems().size()==0) {LogicBusinessException.throwException("cannotMatchOrder");}checkOrderStatus(orderInfo.orderStatus);if (orderInfo.orderStatus != Constant.ORDERSTATUS_ORDERS_SUBMITTED) {LogicBusinessException.throwException("20506");}*///2.价格BigDecimal price = null;//orderBusiness.getOrderMoney(orderInfo);if (price == null) {
//            LogicBusinessException.throwException("cannotPay");}//3.IdentifyString identifier = null;//orderBusiness.getPayIdentify(orderNo, access_token, userInfo, price);PayOperation service = null;//(PayOperation) SpringMVCUtil.getBean( payType);if (service == null) {
//            LogicBusinessException.throwException("service is null");}//5.callbackif (ValueWidget.isNullOrEmpty(callback)) {callback = "https:/order/view?orderNo=" + orderNo /*+ "&orgId=" + orgId*/;//千万不要URL转码}//6.couponBigDecimal coupon = null;/*if (Constant.useDebugCouponValue) {coupon = new BigDecimal(Constant.couponValue);} else {*/coupon = new BigDecimal(0);
//        }//7.应付金额BigDecimal shouldPay = price.subtract(coupon.compareTo(price) < 0 ? coupon : new BigDecimal(0));//String strShouldPay = ValueWidget.formatBigDecimal(shouldPay);//8. 账户String sellerAccount = AlipayConfig.seller_email;//9.其它RedisHelper.getInstance().saveKeyCache(PayService.REDIS_KEY_STORE_ORDER_PAY_TIME, orderNo, TimeHWUtil.formatDate(new Date(), TimeHWUtil.YYYYMMDD_NO_LINE));String orderName = "xxx服务";//10.com.house.ujiayigou.thirdpart.alipay.info.PayFormInfo payFormInfo = new PayFormInfo();payFormInfo.setOut_trade_no(orderNo);payFormInfo.setSubject(orderName);payFormInfo.setBody(orderName);payFormInfo.setTotal_amount(strShouldPay);payFormInfo.setSeller_id(sellerAccount);String form = service.preparePostRequest(payFormInfo);return form;}}

支付回调控制器(需根据实际情况修改):

下面的"/notify"接口

package com.girltest.web.controller.pay;import com.common.dict.Constant2;
import com.common.util.*;
import com.yunmasoft.service.pay.alipay.PayOperation;
import com.io.hw.json.HWJacksonUtils;
import com.string.widget.util.ValueWidget;
import oa.util.SpringMVCUtil;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;@Controller
@RequestMapping("/pay")
public class PayController {public static Logger logger = Logger.getRootLogger();@RequestMapping(value = "notify", produces = {SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF})@ResponseBodypublic String callback(@RequestParam(required = false) String method,@RequestParam(required = false) String out_trade_no/*订单号*/,@RequestParam(required = false) String trade_no,@RequestParam(required = false) String trade_status,@RequestParam(required = false) String extra_common_param,@RequestParam(required = false) String notifyUrl,@RequestParam(required = false) String body/*只有支付宝手机网站支付才有*/,HttpServletResponse response,HttpServletRequest request) {//userIdAndLoginnameAndOrgId 在请求参数中// 1.获取订单号if (ValueWidget.isNullOrEmpty(out_trade_no)) {out_trade_no = request.getParameter("outer_trade_no");}// 2.畅捷支付没有extra_common_param,兼容畅捷支付if (ValueWidget.isNullOrEmpty(extra_common_param) && !ValueWidget.isNullOrEmpty(notifyUrl)) {//added by huangweiiMap argMap = RequestUtil.parseQueryString(notifyUrl);extra_common_param = (String) argMap.get("chanpay");}logger.info(HWJacksonUtils.getJsonP(request.getParameterMap()));// 3.兼容extra_common_param为空的情况boolean isAlipayMobile = false;if (ValueWidget.isNullOrEmpty(extra_common_param)) {//added by huangweii,extra_common_param为空,说明是xx支付String extra_common_paramSuffix = RedisHelper.getInstance().getCache("store_" + out_trade_no + "_Identifier") +"::" + RedisHelper.getInstance().getCache("store_" + out_trade_no + "_userinfo");if (ValueWidget.isNullOrEmpty(request.getParameter("out_trade_no"))) {extra_common_param = "chanpay::" + extra_common_paramSuffix;} else {isAlipayMobile = true;extra_common_param = "alipay::" + extra_common_paramSuffix;}}// 4. 缓存日志
//        String currentCache = RedisHelper.getInstance().getKeyCache(Constant.REDIS_ID_STORE, out_trade_no) + "<br>";
//        RedisHelper.getInstance().saveKeyCacheAndExpire(Constant.REDIS_ID_STORE, out_trade_no, currentCache +request.getRequestURI()+ extra_common_param + ",notifyUrl:" + notifyUrl);logger.info("extra_common_param:" + extra_common_param);// 获取支付宝POST过来反馈信息Map requestParams = request.getParameterMap();Map<String, String> params = WebServletUtil.getParamMap(requestParams);
//        params.put("userIdAndLoginnameAndOrgId", userIdAndLoginnameAndOrgId);// 5.获取servicePayOperation service = null;if (extra_common_param != null && extra_common_param.contains("::")) {String[] info = extra_common_param.split("::");service = (PayOperation) SpringMVCUtil.getBean(request, info[0]);}if (service == null) {return "fail";}// 6.验签String verity_ok = service.verify(WebServletUtil.getParamMap(requestParams));if (!verity_ok.equals("success")) {logger.error(params.toString());logger.error("verify fail");return verity_ok;}// 7. 缓存日志
//        currentCache = RedisHelper.getInstance().getKeyCache(Constant.REDIS_ID_STORE, out_trade_no) + "<br>";
//        RedisHelper.getInstance().saveKeyCacheAndExpire(Constant.REDIS_ID_STORE, out_trade_no, currentCache + "verity->" + verity_ok);// 8.回调,调用确认订单接口try {String pay_ok = service.payNotify(out_trade_no, trade_no, trade_status, params);if (pay_ok != null) {logger.debug(pay_ok + "");return pay_ok; // 请不要修改或删除}} catch (Exception ex) {logger.error("payNOtify error:", ex);return "fail";}return "fail";}@RequestMapping(value = "payResult")public String getPaymentResult(@RequestParam(required = false) String orderid,@RequestParam(required = false) String userid,HttpServletRequest request,HttpServletResponse response,Model model) throws IOException {logger.info("payResult orderid:" + orderid);// 获取支付宝POST过来反馈信息Map requestParams = request.getParameterMap();Map<String, String> params = WebServletUtil.getParamMap(requestParams);String orderId = orderid;if (ValueWidget.isNullOrEmpty(orderId)) {orderId = params.get("orderid");}if (orderId == null) {orderId = params.get("out_trade_no");}//畅捷支付点击[返回商家] TODOif (orderId == null) {orderId = params.get("orderId");}logger.info("payResult params:" + params);String payResult = params.get("payResult");String extra_common_param = params.get("extra_common_param");logger.info("payResult extra_common_param:" + extra_common_param);if (!Constant2.CHANPAY_ORDER_RESULT_SUCCESS.equals(payResult)) {response.sendRedirect("/order/payOrder?orderId=" + orderId /*+ "&orgId=" + service.getOrgId(orderId)*/);return null;}response.sendRedirect("/order/payComplete?orderId=" + orderId /*+ "&orgId=" + service.getOrgId(orderId)*/);return null;}}

实际支付demo:

http://i.yhskyc.com/product/1

各文档:

电脑网站支付快速接入
https://docs.open.alipay.com/270/105899/
API 详细说明:
https://docs.open.alipay.com/270/alipay.trade.page.pay/

服务端SDK
https://docs.open.alipay.com/54/103419

RSA私钥及公钥生成
https://docs.open.alipay.com/58/103242/

RSA私钥及公钥生成 工具:

https://gitee.com/kunlunsoft/http_request_tool

上图中2048 对应RSA2

相关项目:

https://github.com/liuyu520/io0007

https://gitee.com/kunlunsoft/oa_framework

注意:

1,本项目使用新版支付宝支付

即时到账新老版本接口对比
https://docs.open.alipay.com/270/106759

2,新版支付宝支付,就算仅使用PC端网页支付,也需要创建一个应用,老版不需要.

3,电脑端网页支付应该使用:
AlipayTradePagePayRequest,而不是AlipayTradePayRequest;

4,对业务参数(非公共参数),进行 json 序列化时,
一定使用阿里自己的类:
JSONWriter writer = new JSONWriter();
String body=writer.write(model, true);

转载于:https://my.oschina.net/huangweiindex/blog/1637847

java 对接支付宝支付相关推荐

  1. JAVA对接支付宝支付(超详细,一看就懂)

    Java对接支付宝支付 更多内容 冷文博客: 传送门 引入 为什么要发这篇帖子呢?原因很简单,就是因为在一个稍稍正规一点的应用上都会有支付这个环节,我们日常的在线支付如今包括支付宝,微信钱包,QQ钱包 ...

  2. java对接支付宝支付

    java对接支付宝支付演示 现在有不少的项目都需要对接支付,这里主要是进行讲解对接支付宝H5支付 废话不多说 上代码 引入支付宝官方的sdk <!-- https://mvnrepository ...

  3. 【超详细,全流程】java对接支付宝支付

    支付流程 一.对接前的准备 1.1创建应用,获取参数:APPID(使用沙箱环境可跳过) 1.1.1添加产品 1.1.2配置密钥,获取第二个参数:商户的私钥 1.1.3支付宝网关 1.1.4生成参数密钥 ...

  4. java对接支付宝支付(手机网站支付)

    记录一下对接支付宝支付的过程,既是对这段时间工作的总结,也希望能对之后需要对接支付宝手机网站支付的小伙伴一点帮助. 1.查看官方文档,具体对接流程(https://docs.open.alipay.c ...

  5. Java对接支付宝支付(App+H5)

    App+H5支付方式(比微信简单) 1.登录支付宝开放平台,选择网页和移动应用: 2.填完app相关的信息后,点击App,设置接口加签方式:如下,选择SHA256,然后通过支付宝提供的工具生成公私钥对 ...

  6. Java对接第三方支付渠道之支付宝支付

    提示:支付宝相对于微信支付更人性化,且细节做得更好. Java对接第三方支付渠道之支付宝支付 一.前期准备工作 二.导入依赖 三.书写配置类 四.书写配置文件 五.调用相关支付接口 1.流程图 2.创 ...

  7. java对接支付宝实现支付功能

    ** java对接支付宝实现支付功能 ** Controller /*** 支付功能* @return*/ @RequestMapping("/test") public Mode ...

  8. JAVA对接微信支付和支付宝支付(APP端支付)

    本文主要介绍的是JAVA对接支付宝和微信支付,废话少说上代码(部分业务代码就不上了,例如订单等,根据业务需求自行修改): 用到的工具类: maven依赖: <!-- https://mvnrep ...

  9. java对接支付宝小程序支付

    今天晚上12点部署生产项目,又是个不眠夜. 之前整的好多东西都忘光了,还是记录下来吧. 跟对接支付宝支付差不多,地址:小程序支付能力介绍 | 小程序 开通流程: 1.先要去支付宝开放平台,创建小程序. ...

最新文章

  1. day32-1 事件Event
  2. bootstrap ui
  3. NEU 1497 Kid and Ants 思路 难度:0
  4. K8S Deployment脚本部署Tomcat集群
  5. jsp访问java方法_JSP基础知识之访问JavaBean的方法
  6. (转) Core Animation 简介
  7. Android之Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
  8. B.一个人的旅行 (dijkstra算法)
  9. 项目管理综述(需要完善)
  10. sqlserver2008的数据库自动备份方法(转载)
  11. discuz的css文件在哪里,谁能告诉我discuz模板文件在哪个文件夹下?
  12. html5播放器 php,PHP/HTML5页面上的随机声音播放器
  13. HMM模型及相关算法
  14. linux下载大文件失败,Linux下FTP/SFTP传输大文件总是失败的处理办法
  15. 第二周python牛客练习题
  16. 2021双十一活动:华为云服务器体验活动,免费领取50G云硬盘,邀请参加再送价值200元华为无线鼠标键盘套装
  17. 解决 PHP SOAP-ERROR: Parsing WSDL: Couldn't load from 问题
  18. 应用comsol分析水力压裂对井眼附近应力场的影响
  19. 邮件push服务器,Coremail Push
  20. 数据结构----顺序表的增和遍历(2018/10/23)

热门文章

  1. hasOwnProperty和isPrototypeOf
  2. 多线程socket 端口扫描程序,实现了,但是速度不行,求指点。
  3. vue 引入json地图_VUE中通过Echarts引入地图
  4. PageHelper分页插件使用
  5. 目标检测排行榜_3D领域重大突破!大华股份人工智能取得KITTI Object 3D车辆检测排行榜第一名...
  6. 怎么把一个RPM包安装到不同的目录?
  7. Netty从零开始(一)
  8. 2022年数据库云管平台白皮书
  9. 常用中后台交互设计控件使用场景与规范总结
  10. 2020品牌情商指数报告