支付宝接口的调用

  1. 支付流程图在这里插入图片描述

  2. 对接支付宝的准备工作

一、申请条件
1.企业或个体工商户可申请;
2. 提供真实有效的营业执照,且支付宝账户名称需与营业执照主体一致;
3. 网站能正常访问且页面信息有完整商品内容;
4. 网站必须通过ICP备案,个体户备案需与账户主体一致。
(团购类网站不支持个体工商户签约)

  1. alipay.properties
#支付宝的接口地址
alipay_url=https://openapi.alipay.com/gateway.do
#企业与支付宝合作伙伴Id
app_id=2018020102122556
#企业自己的私钥
app_private_key=MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCdQeknhM2rhiGAH6V0ljxn3rAWIdzduTEQuteTfwjnZtvMhQPuuN1b/88D5yMuaZhZNFeUdWb+SmtP9DAzAWWgnT13T0YhJcxP6txm7JBRrjadCRt+LOFxPiPQk5t9fH7yXjw9i4uMDsNJeTncrVZ/AZYrk0ESC9anJR8XeuBc3HE8T4fqlKKl35jlumIWrPbPNQhKGXaGcOnpiaXO9qYYUSP/tnrjNYXHOso0yBs4YTl+LLX2TJ12p3n/oX6HnL4zQgtN5k4QasHP7CIig1ngcVQGfWsMm4djI9KXNXvGLQPfMQEmyb71mM5OCdl1MtAc6OaIAymhSv2hOLNIuyodAgMBAAECggEAe05/P5mGm4QlKI2n8u8KlneqovASe1kG/BNFjkYB+VBR8OAr4TfbepPvAyRuFap+5xN/yMz14VcBJkRWtufVhEdHNxJV7w/wUIncIGhGEYYFFMVbZWhTrbQH6TiUp6TC9dCmc6vD1CKPRkFj+YGBXT0lPy3LzBa0TYNyCbszyhthrgkpuFYbB0R93IPvvBh5NJFXQytwNb2oVopC9AQWviqnZUZcT0eJ087dQ1WLPa6blBD8DP1PUq0Ldr6pgKfObFxIj8+87DlJznRfdEsbqZlS7jagdw5tLr71WJpctIGPqKpgvajfePP/lj3eY82BKQB+aTw0zmAiB05Yes4LgQKBgQDq3EiQR8J1MEN2rpiLt1WvDYYvKVUgOY7Od//fRPgaMBstbe4TzGBpR8E+z267bHAWLaWtHkfX6muFHn1x68ozEUWk/nZq0smWnuPdcy4E7Itbk36W2FF/rOZB7j5ddlC9byrxDSNgcf9/FA/CU+i5KVQpLYfsk2dvwomvu0aFVQKBgQCraXpxzMmsBx4127LsZDO5bxfxb6nqzyK4NPe0VaGiRg8oaCWczcLz1J5iRqC9QeEwsSt4XU1sYBMTcsFpA0apZpm3prH2HJRx/isNENesaHcihF0mMd0WxU3xyRvWSDeZV5A1Zy1ZEJ+p17DGwb2j+yo2uBrDNXBgBWEzXwiRqQKBgBdXFvsHtqKQzlOQHGbeLGy+KlSrheMy9Sc9s7cLkqB/oWPNZfifugEceW71jGqh5y29EZb3yGoDyPWsxwi4Rxr2H3a7Nyd8lT4bwkdyt+MTYvIR4WW6T7chhqyMsbP2GyYIUzsrdBWUnrCRXNOSJTGpksyY0sZHC+OGcMp/EQ4VAoGBAIISSVL/pm1+/UK7U1ukcced8JpKNLM0uVD1CJ50eHHOHgR4e0owrWYfioxisejLjBlJ6AWvL2g0w2T3qKKKVN2JOM4ulU5/w3l4+KwygqaWowizTogEQJPd5ta52ADTzjTzSD/t6nByd+YHAWLhc4lyt0bMj6pf68VBb8/upm75AoGAGAYz79IVHp9eppykufjNcWu6okkG8tZnzuyaWKW/CuKKBWMaTk0vcyQlfJfxIBccoQrBuYyXBdcpPuZ/ys2C25pNrkACuhIKNgnMc0floJoYEfJzetw/3cIimWu4NJzVQOaojaGA58oo2+fub43Xn25Jq4rvSVe3oLdb5xWkw5Q=
#支付宝公钥
alipay_public_key=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhkZi6W0wn/prX+NIIF9ATb5Z8ReKK4hFYtBrweDfGHD1mNW7YIZY4G5hE7S2Sry8eFXlFgSlBWlJ4fVnDaK9MkVThpwE2H65ooVlK/wLuyPqovIVpMt/utva5Ayuzv7eQOWK45FdLDNDlK8QLoBko6SS+YbnWnf7a+mrf4NAS4UFClpfe8Byqe8XIraO2Cg4Ko5Y5schX39rOAH8GlLdgqQRYVQ2dCnkIQ+L+I4Cy9Mvw3rIkTwt3MBU+AqREXY4r5Bn6cmmX/9MAJbFqrofGiUAqG+qbjTcZAzgNPfuiD0zXgt/YYjMQMzck75BOmwnYOam2ajODUSQn8Xybsa7wQIDAQAB# 同步回调地址 重定向地址本地浏览器
return_payment_url=http://payment.gmall.com:8087/alipay/callback/return# 异步通知地址 公网接口(webService)
notify_payment_url=http://60.205.215.91/alipay/callback/notifyreturn_order_url=http://order.gmall.com:8086/orderList
  1. 类AlipayConfig整合到项目
@Configuration
@PropertySource("classpath:alipay.properties")
public class AlipayConfig {@Value("${alipay_url}")private String alipay_url;@Value("${app_private_key}")private String app_private_key;@Value("${app_id}")private String app_id;public final static String format="json";public final static String charset="utf-8";public final static String sign_type="RSA2";public static String return_payment_url;public static  String notify_payment_url;public static  String return_order_url;public static  String alipay_public_key;@Value("${alipay_public_key}")public   void setAlipay_public_key(String alipay_public_key) {AlipayConfig.alipay_public_key = alipay_public_key;}@Value("${return_payment_url}")public   void setReturn_url(String return_payment_url) {AlipayConfig.return_payment_url = return_payment_url;}@Value("${notify_payment_url}")public   void setNotify_url(String notify_payment_url) {AlipayConfig.notify_payment_url = notify_payment_url;}@Value("${return_order_url}")public   void setReturn_order_url(String return_order_url) {AlipayConfig.return_order_url = return_order_url;}@Beanpublic AlipayClient alipayClient(){AlipayClient alipayClient=new DefaultAlipayClient(alipay_url,app_id,app_private_key,format,charset, alipay_public_key,sign_type );return alipayClient;}
  1. PaymentMapper.java
public interface PaymentMapper extends Mapper<PaymentInfo>{
}
  1. PaymentServiceImpl.java
@Service
public class PaymentServiceImpl implements PaymentService{@AutowiredPaymentMapper paymentMapper;@AutowiredActiveMQUtil activeMQUtil;@AutowiredAlipayClient alipayClient;@Overridepublic void savePaymentInfo(PaymentInfo paymentInfo) {paymentMapper.insert(paymentInfo);}@Overridepublic void updatePayment(PaymentInfo paymentInfo) {//幂等性检查PaymentInfo paymentInfoParam = new PaymentInfo();paymentInfoParam.setOrderSn(paymentInfo.getOrderSn());PaymentInfo paymentInfoResult=paymentMapper.selectOne(paymentInfoParam);if(StringUtils.isNotBlank(paymentInfoResult.getPaymentStatus())&&paymentInfoResult.getPaymentStatus().equals("已支付")){return;}else{String orderSn = paymentInfo.getOrderSn();Example example=new Example(PaymentInfo.class);example.createCriteria().andEqualTo("orderSn",orderSn);ConnectionFactory connectionFactory = activeMQUtil.getConnectionFactory();Session session=null;Connection connection=null;try {connection = connectionFactory.createConnection();session = connection.createSession(true, Session.SESSION_TRANSACTED);} catch (JMSException e) {e.printStackTrace();}try{paymentMapper.updateByExampleSelective(paymentInfo,example);//支付成功后,引起系统服务===》订单服务===》库存服务===》物流//调用mq发送支付成功的消息Queue payment_success_queue = session.createQueue("PAYMENT_SUCCESS_QUEUE");MessageProducer producer = session.createProducer(payment_success_queue);//字符串文本//TextMessage textMessage=new ActiveMQTextMessage();//hash结构MapMessage mapMessage=new ActiveMQMapMessage();mapMessage.setString("out_trade_no",paymentInfo.getOrderSn());producer.send(mapMessage);session.commit();}catch (Exception e){//消息回滚try {session.rollback();} catch (JMSException e1) {e1.printStackTrace();}}finally {try {connection.close();} catch (JMSException e) {e.printStackTrace();}}}}@Overridepublic void sendDelayPaymentResultCheckQueue(String outTrade,int count) {ConnectionFactory connectionFactory = activeMQUtil.getConnectionFactory();Session session=null;Connection connection=null;try {connection = connectionFactory.createConnection();session = connection.createSession(true, Session.SESSION_TRANSACTED);} catch (JMSException e) {e.printStackTrace();}try{Queue payment_success_queue = session.createQueue("PAYMENT_CHECK_QUEUE");MessageProducer producer = session.createProducer(payment_success_queue);//字符串文本//TextMessage textMessage=new ActiveMQTextMessage();//hash结构MapMessage mapMessage=new ActiveMQMapMessage();mapMessage.setString("out_trade_no",outTrade);mapMessage.setInt("count",count);//为消息加入延迟时间mapMessage.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY,1000*60);producer.send(mapMessage);session.commit();}catch (Exception e){//消息回滚try {session.rollback();} catch (JMSException e1) {e1.printStackTrace();}}finally {try {connection.close();} catch (JMSException e) {e.printStackTrace();}}}@Overridepublic Map<String, Object> checkAlipayPayment(String out_trade_no) {AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();HashMap<String, Object> resultMap = new HashMap<>();resultMap.put("out_trade_no",out_trade_no);request.setBizContent(JSON.toJSONString(resultMap));AlipayTradeQueryResponse response = null;try {response = alipayClient.execute(request);} catch (AlipayApiException e) {e.printStackTrace();}if(response.isSuccess()){System.out.println("交易创建已创建,调用成功");resultMap.put("out_trade_no",response.getOutTradeNo());resultMap.put("trade_no",response.getTradeNo());resultMap.put("trade_status",response.getTradeStatus());resultMap.put("call_back_content",response.getMsg());} else {System.out.println("有可能交易创建未创建,调用失败");}return resultMap;}
}

8.PaymentController.java

@Controller
public class PaymentController {@AutowiredAlipayClient alipayClient;@AutowiredPaymentService paymentService;@ReferenceOrderService orderService;@RequestMapping("alipay/callback/return")@LoginRequired(loginSuccess = true)public  String aliPaycallBackReturn(HttpServletRequest request, ModelMap modelMap){//更新用户的支付状态String sign = request.getParameter("sign");String trade_no=request.getParameter("trade_no");String out_trade_no = request.getParameter("out_trade_no");String trade_status = request.getParameter("trade_status");String total_amount = request.getParameter("total_amount");String subject = request.getParameter("subject");String call_back_content = request.getQueryString();//通过支付宝的paymentMap进行签名验证,2.0版本中将接口paymentMap参数去掉了,导致同步请求无法验签if(StringUtils.isNotBlank(sign)){//验签成功//进行支付更新的幂等性检查操作PaymentInfo paymentInfo = new PaymentInfo();paymentInfo.setOrderSn(out_trade_no);//支付宝的交易凭证号paymentInfo.setPaymentStatus("已支付");paymentInfo.setAlipayTradeNo(trade_no);paymentInfo.setCallbackTime(new Date());//回调请求字符串paymentInfo.setCallbackContent(call_back_content);//更新用户的支付状态paymentService.updatePayment(paymentInfo);}//支付成功后,引起系统服务===》订单服务===》库存服务===》物流//调用mq发送支付成功的消息return "finish";}@RequestMapping("wx/submit")@LoginRequired(loginSuccess = true)public  String wxPay(String outTrade, BigDecimal totalAmount, HttpServletRequest request, ModelMap modelMap){return "";}@RequestMapping("alipay/submit")@LoginRequired(loginSuccess = true)@ResponseBodypublic  String aliPay(String outTrade, BigDecimal totalAmount, HttpServletRequest request, ModelMap modelMap){//获得支付宝客户端,不是一个链接而是针对http的表单请求String form="";//创建API对应的requestAlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();//同步回调地址alipayRequest.setReturnUrl(AlipayConfig.return_payment_url);alipayRequest.setNotifyUrl(AlipayConfig.notify_payment_url);Map<String,Object> map=new HashMap<>();map.put("out_trade_no",outTrade);map.put("product_code","FAST_INSTANT_TRADE_PAY");map.put("total_amount",0.01);map.put("subject","JD Apple 10 phone");String param = JSON.toJSONString(map);alipayRequest.setBizContent(param);try {form = alipayClient.pageExecute(alipayRequest).getBody();} catch (AlipayApiException e) {e.printStackTrace();}//生成用户的支付信息OmsOrder omsOrder=orderService.getOrderByOutTradeNo(outTrade);PaymentInfo paymentInfo = new PaymentInfo();paymentInfo.setCreateTime(new Date());paymentInfo.setOrderId(omsOrder.getId());paymentInfo.setOrderSn(outTrade);paymentInfo.setPaymentStatus("未付款");paymentInfo.setSubject("JD商品");paymentInfo.setTotalAmount(totalAmount);paymentService.savePaymentInfo(paymentInfo );//向消息中间件发送一个检查支付状态(支付服务的延迟消息队列)paymentService.sendDelayPaymentResultCheckQueue(outTrade,5);//提交请求到支付宝return form;}@RequestMapping("index")@LoginRequired(loginSuccess = true)public  String index(String outTrade, BigDecimal totalAmount, HttpServletRequest request, ModelMap modelMap){String memberId = (String)request.getAttribute("memberId");String nickName = (String) request.getAttribute("nickName");modelMap.put("memberId",memberId);modelMap.put("outTrade",outTrade);modelMap.put("nickName",nickName);modelMap.put("totalAmount",totalAmount);return "index";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/40773.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信 及支付宝 支付接口 功能

1&#xff1a;首页需要了解支付宝跟微信的开发文档&#xff0c;这里就贴上文档网址&#xff0c;不做过多描述 微信&#xff1a;https://pay.weixin.qq.com/wiki/doc/api/index.html 支付宝&#xff1a;https://open.alipay.com/developmentDocument.htm 2&#xff1a;业务流程…

android应用程序如何调用支付宝接口

最近在做一个关于购物商城的项目&#xff0c;项目里面付款这块我选的是调用支付宝的接口&#xff0c;因为用的人比较多。 在网上搜索了以下&#xff0c;有很多这方面的教程&#xff0c;但大部分教程过于陈旧&#xff0c;而且描述的过于简单。而且支付宝提供的接口一直在更新&am…

小编和ChatGPT聊了下智能运维,大家看看能不能把专家替了?

近日&#xff0c;聊天机器人ChatGPT爆火&#xff0c;仅仅推出2个月&#xff0c;其月活跃用户就成功过亿&#xff0c;成为历史上增长最快的消费者应用程序。连一向高调的马斯克在使用ChatGPT都直呼“好到吓人”&#xff0c;甚至断言&#xff1a;“我们离强大到危险的AI不远了。”…

外贸单证制作常用名称中英互译表

外贸单证制作对于外贸人来说会遇到的样式很多&#xff0c;因此在进行这项工作的过程中&#xff0c;会有很多专业单证英文名称&#xff0c;对于这些名称的了解就很重要。这里汇信外贸管理软件整理了包含390种常用外贸单证名称的中英互译表&#xff0c;大家来分享吧&#xff01; …

广外2023口译(非英专)复习资料以及模考反馈

大家好&#xff0c;有几位同学想让我更新一下口译&#xff0c;本人听译情况&#xff08;四级听力209&#xff0c;六级听力197&#xff0c;广外笔译94&#xff09; here I come&#xff01;还是个人复习向&#xff0c;现在这个节点了&#xff0c;平时没练的话就只能求保命了。 …

香港中文大学计算机辅助翻译课程,港中文翻译(MA in Translation)专业申请解析...

原标题&#xff1a;港中文翻译(MA in Translation)专业申请解析 最近随着《亲爱的翻译官》的热播&#xff0c;翻译专业也重新受到大家的关注&#xff0c;下面我们就给大家介绍香港中文大学翻译硕士(Master of Arts in Translation)。 项目时长&#xff1a;1年 学费&#xff1a;…

【打卡帖】7日玩转ESP32——(第2日) GPIO输入,按键的长按和短按

文章目录 一、硬件准备二、知识要点三、参考例程四、今日作业五、参考答案5.1 知识点5.2 中断方式5.3 定时扫描 六、打卡~ 一、硬件准备 开发板上面有一个Boot Button按键。 从原理图可以看出&#xff0c;按键按下时&#xff0c;GPIO9是低电平。按键弹起时&#xff0c;GPIO是…

006. esp32 下载--第二版

1. 先按boot键&#xff08;不放开&#xff09;&#xff0c;再按 复位按键&#xff0c;按下&#xff0c;放开。会进入下载模式。如果进入下载模式失败。 重复&#xff0c;按住Boot键不放&#xff0c;复位按键&#xff0c;按下&#xff0c;放开。 2.下载图示如下&#xff1a; …

基于ESP32的硬件项目教程(三)ESP32的引脚说明及数字信号读写操作

引脚说明 以下图为例 图片下方的英文部分已经有了介绍&#xff0c;本文将进行一次简述。 此型号开发板一共38个引脚&#xff0c;除去电源引脚外&#xff0c;可用IO引脚为34个&#xff0c;在图中有GPIO6~GPIO11等6个引脚标注有红色“&#xff01;”&#xff0c;这6个引脚常作为…

【填坑】ESP32 bootloader初探(上)

前言 大名鼎鼎的乐鑫ESP8266 WIFI模组你应该不陌生&#xff0c;不用我多说了。在这之后乐鑫还更迭了更多高性能的芯片型号&#xff0c;比如这次我要记录的ESP32-C3&#xff0c;搭载近期很火的RISC-V指令集处理器&#xff0c;支持2.4G wifi、BLE-5&#xff0c;拥有丰富应用场景…

ESP32初级入门

1.下载的时候如果出现不能下载&#xff0c;那是因为没复位&#xff0c;在出现connect时按住板子上的boot按键&#xff0c;出进度了然后松开&#xff0c;就会正常下载。 2.点灯和uno一样&#xff0c;直接在setup里面设置管脚模式&#xff0c;在loop里面赋值就行&#xff0c;根本…

ESP32 Secure Boot和Flash加密

ESP32的代码是存在外部Flash中&#xff0c;如果不加密&#xff0c;很容易被窃取代码。 ESP32的secure boot和flash加密是两个功能&#xff0c;但是要配合一起使用&#xff0c;其加密效果才好。 一、初次加密。 这里只写可重复烧写的加密方式&#xff0c;其加密步骤如下&…

ESP32修改BootLoader:在boot中添加GPIO和IIC驱动方式

ESP32修改BootLoader&#xff1a;在boot中添加GPIO和IIC驱动方式 1. ESP Bootloader简介 ESP32有着强大的引导加载程序&#xff08;Bootloader&#xff09;功能&#xff1a; 主要执行以下任务&#xff1a; 内部模块的最小化初始配置&#xff1b; 根据分区表和 ota_data&#…

ESP32 基础篇: 启动时 rst cause 和 boot mode

本文参考 ESP32 技术参考手册 和 ESP32-WROOM-32 datasheet 简介 在 ESP32 启动时, ROM CODE 会读取 GPIO 状态和 rst cause 状态, 进而决定 ESP32 工作模式。 通过了解和掌握 rst cause 和 boot mode, 有助于定位某些系统问题。 例如: ESP32 启动时会有如下打印: rst:0x1 (…

微信小程序 自动对对联

微信小程序 自动对对联 微信扫描二维码体验吧

使用scoped让样式只对当前页面其作用时/deep/ 可以使其对子组件起作用

官方文档https://vue-loader.vuejs.org/guide/scoped-css.html#mixing-local-and-global-styles 使其样式只对当前页面起作用 影响到里面的子组件

uniapp-微信小程序,对子组件实现onShow效果

背景&#xff1a;使用uni-app开发一个微信小程序&#xff0c;使用的vue子组件&#xff0c;发现在子组件里面不能使用onShow生命周期&#xff0c;但是可以在page里面可以调用&#xff0c;需要在使用uni.navigateBack()返回后&#xff0c;该组件能请求接口数据刷新 解决&#xf…

基于强化学习的大规模多任务机器人训练

发布人:Google 机器人团队高级研究员 Karol Hausman 和研究员 Yevgen Chebotar 通用机器人要想发挥最大的作用,就需要能够完成一系列的任务,如清洁、维护和运送。但是,使用离线强化学习 (RL)(智能体使用以前收集的数据开展训练,在试验和错误中学习的一种方法)来训练,即…

数据库MySQL详解

全网最详细MySQL教程&#xff0c;应付大学考试、考研复试、求职笔试应该说是完全足够的&#xff0c; 有兴趣的朋友可以看我的MySQL专栏&#xff0c;都是MySQL原理和底层一点的东西&#xff0c;可能比一般的面试文都深入。 本文篇幅较长&#xff0c;笔误之处在所难免&#xff0c…

关于对Vue中slot插槽理解

关于slot插槽理解 1.何时需要使用插槽 在开发中&#xff0c;我们需要将共性内容抽取到组件中&#xff0c;将不同的暴露为插槽。 插槽的益处便是&#xff0c;一旦预留了插槽&#xff0c;使用者便可以根据自己的需求来决定插槽中插入的的内容2. slot的基本使用 <div idapp&…