Java简单调用支付宝当面付生成支付二维码

技术标签: spring  Java  java  

package com.tony.alipaycollection.service.impl;


import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradePrecreateModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.tony.alipaycollection.config.ApiException;
import com.tony.alipaycollection.config.RetEnum;
import com.tony.alipaycollection.consts.AlipayConsts;
import com.tony.alipaycollection.service.AlipayService;
import com.tony.alipaycollection.vo.AlipayBean;
import com.tony.alipaycollection.vo.AlipayJsonRootBean;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author tony
 * @date 2020/8/19 13:42
 */
@Slf4j
@Service
public class AlipayServiceImpl implements AlipayService {

    /**支付宝请求地址*/
    private static String aliUrl = "https://openapi.alipay.com/gateway.do";
    /**支付宝应用ID*/
    private static String aliAppId = "11223344";
    /**本地通过"支付宝开放平台开发助手"生成的私钥*/
    private static String aliAppPrivateKey = "ABCD123";
    /**支付宝应用设置本地公钥后生成对应的支付宝公钥(非本地生成的公钥)*/
    private static String alipayPublicKey = "ABCD123";;
    /**支付宝回调的接口地址*/
    private static String aliNotifyUrl = "http://localhost:8080/alinotify";

    @Override
    public String newAliOrder() throws Exception {
        log.info("开始调用支付宝生成支付二维码...");
        //实例化客户端
        AlipayClient alipayClient = new DefaultAlipayClient(aliUrl, aliAppId, aliAppPrivateKey, "json", "utf-8", alipayPublicKey, "RSA2");
        //设置请求参数
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
        model.setOutTradeNo("20200826888888888888888");
        model.setTotalAmount("1");
        model.setSubject("充值");
        //如果没有店铺号可不设置
        model.setStoreId("9527");
        model.setQrCodeTimeoutExpress("10m");
        request.setBizModel(model);
        //支付宝异步通知地址
        request.setNotifyUrl(aliNotifyUrl);
        log.info("创建支付宝订单,请求参数:{} ", JSONObject.toJSONString(request));
        //调用接口
        AlipayTradePrecreateResponse response = alipayClient.execute(request);

        log.info("创建支付宝订单,返回值:{} ", JSONObject.toJSONString(response));
        if (!response.isSuccess()) {
            throw new ApiException(RetEnum.MachineOrderAlipayException);
        }
        AlipayJsonRootBean alipayJsonRootBean = JSONObject.parseObject(response.getBody(), AlipayJsonRootBean.class);
        if(!AlipayConsts.SuccessCode.equals(alipayJsonRootBean.getAlipay_trade_precreate_response().getCode())){
            throw new ApiException(RetEnum.MachineOrderAlipayException);
        }
        log.info("交易订单号outTradeNo:{} ", response.getOutTradeNo());
        log.info("支付二维码qrCode:{} ", response.getQrCode());
        return response.getQrCode();
    }

    @Override
    public void aliNotify(Map<String, String> param) throws Exception {
        log.info("支付宝异步回调接口数据处理");
        //只有支付成功后,支付宝才会回调应用接口,可直接获取支付宝响应的参数
        String order_id = param.get(AlipayConsts.AliOutTradeNo);
        //出于安全考虑,通过支付宝回传的订单号查询支付宝交易信息
        AlipayTradeQueryResponse aliResp = queryOrder(order_id);
        if (!AlipayConsts.SuccessCode.equals(aliResp.getCode())) {
            //返回值非10000
            throw new ApiException(RetEnum.MachineOrderAlipayException, aliResp.getSubMsg());
        }
        if (!AlipayConsts.AliTradeSuccess.equals(aliResp.getTradeStatus()) && !AlipayConsts.AliTradeFinished.equals(aliResp.getTradeStatus())) {
            //支付宝订单状态不是支付成功
            throw new ApiException(RetEnum.MachineOrderAliUnPay);
        }
        //可对支付宝响应参数AlipayTradeQueryResponse进行处理

    }

    @Override
    public AlipayTradeQueryResponse queryOrder(String orderId) throws Exception {
        log.info("查询支付宝订单,订单编号为:{}", orderId);
        AlipayClient alipayClient = new DefaultAlipayClient(aliUrl, aliAppId, aliAppPrivateKey, "json", "utf-8", alipayPublicKey, "RSA2");
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        AlipayTradeQueryModel model = new AlipayTradeQueryModel();
        model.setOutTradeNo(orderId);
        request.setBizModel(model);
        AlipayTradeQueryResponse response = alipayClient.execute(request);
        log.info("查询支付宝订单,返回数据:{}", response);
        return response;
    }


}

maven依赖:

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.10.97.ALL</version>
</dependency>

完整代码: https://github.com/zhongzhihao1995/alipaycollection.git

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_26494147/article/details/108252502

智能推荐

Eclipse3.3语言项目释出——Babel Project!_iteye_17583的博客-程序员宅基地

     由Chris Nguyen领导的Eclipse3.3语言翻译项目Babel最近释出。在eclipse项目下载-&amp;gt;平台页面下有此项目的下载链接。不过,在babel下并没有对该项目的说明信息。只有——让eclipse显示出你想要的语言,帮助翻译eclipse,把现有的项目加进babel,成为babel的一员等四个链接。下载链接页面给出了Web升级站点:http://downlo...

java callable用法_在Java中使用Callable和Future_GarryTonon的博客-程序员宅基地

最近,我们正在开发一个监控仪表板,我们想要ping几个第三方服务器,只是为了检查它们的可用性,或者我们想要调用健康检查。我们正在对服务器进行一系列api调用,这些服务器的IP,用户名和密码被外部化为环境变量。然后是我们的负载均衡器抛出HTTP 504(网关超时)的挑战,因为这些请求花了很多时间来返回结果。因此,我们继续使用Callable和Future同时进行这些调用以减少所需的时间。在开发多线程...

Java面试知识点(九)URL的组成_温柔的谢世杰的博客-程序员宅基地_java url组成

URL(Uniform Resource Locator) ,统一资源定位符,能够对因特网的资源进行定位。URL 一般有四部分组成: &lt;协议&gt;://&lt; 主机 &gt;:&lt; 端口 &gt;/&lt; 路径 &gt;现在最常用的 &lt;协议&gt; 为 http 协议。&lt;主机&gt; 是指主机在因特网上的域名。(ip 地址 + 子网掩码 = 主机号)http 协...

Solr集群的创建与使用_小希一夏的博客-程序员宅基地

1. Solr集群-SolrCloud介绍(1) 什么是SolrCloud?SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用SolrCloud。当一个系统的索引数据量少的时候是不需要使用SolrCloud 的,当索引量很大,搜索请求并发很高,这时需要使用SolrCloud来满足这些需求(2) SolrCloud的原理是什么?...

使用pl sql连接oracle,使用PL/SQL连接别人的Oracle_芯随表动的博客-程序员宅基地

1、下载Instant Client下载后是一个压缩文件,解压后的文件叫instantclient_11_2,放在自己喜欢的目录,如:D:/instantclient_11_22、D:/instantclient_11_2目录下新建目录network,在network目录下再新建目录admin,在admin目录下新建tnsnames.ora,使用文本编辑器输入如下内容:MyOracle =(DES...

随便推点

mysql internal bug_MySQL Bug导致异常宕机的分析流程_苏安德的博客-程序员宅基地

本文主要通过一个bug来记录一下如何分析一个MySQL bug的崩溃信息。版本:Percona 5.7.17-11一、数据库重启日志分析terminate called after throwing an instance of 'std::out_of_range'what(): vector::_M_range_check04:10:09 UTC - mysqld got signal 6 ...

向上的箭头 html,HTML中利用div+CSS实现简单的箭头图标_fafa阿花的博客-程序员宅基地

在网页设计中,我们经常得会用到一些箭头做为装饰来点缀我们的网页,虽然现在很多的网站的设计者们都喜欢以引用字体图标的形式来实现箭头的效果,但那样也会给网页的加载造成一些影响。今天飞鸟慕鱼小编就给大家说一说,在网页设计中如何利用div加CSS的方式来实现一些箭头的效果。DIV+CSS实现实心小箭头的效果在网页的一些二级导航菜单,或是带有下拉功能的列表等处,都会有一些实现的小箭头来表示一个DIV有含有内...

class instance java_Java Class.newInstance()方法_少吃菜多吃肉的博客-程序员宅基地

只有当类具有默认的构造器时,才能调用Class.newInstance();否则抛异常:具体执行情况可以调试进去看看。————————————————————————————————————————at java.lang.Class.newInstance0(Class.java:340)at java.lang.Class.newInstance(Class.java:308)————————...

数学与计算机学院迎新晚会,数青春年华,计未来梦想——数学系、计算机科学系举办2016级迎新晚会..._Lele Feng的博客-程序员宅基地

青春似火,岁月如歌。为迎接大一新生的到来,数学系、计算机科学系于10月30日19:00的A区隆重举办了以"数青春年华,计未来梦想"为主题的2016级迎新文艺晚会。旅游环生系党总支杨建蓉副书记、数学系计算机科学系党总支刘家彬书记、王长明副主任、全系教师及各系团总支副书记、学生会主席、我系2016级全体新生和部分老生观看了本次晚会。晚会由刘佳艳、马彦瑛、辜贝、向国健四位同学主持。热情洋溢的藏舞《情满草...

C语言回慕课回文数,合工大OJ 1331 回文数_weixin_29982021的博客-程序员宅基地

Description一个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数。任取一个正整数,如果不是回文数,将该数与他的倒序数相加,若其和不是回文数,则重复上述步骤,一直到获得回文数为止。例如:68变成154(68+86),再变成605(154+451),最后变成1111(605+506),而1111是回文数。于是有数学家提出一个猜想:不论开始是什么正...

oracle 隐藏行号,记录oracle中的行号_不再小心翼翼的博客-程序员宅基地

我目前正在处理程序中的日志错误.此过程的目标是在DB中的其他包中的异常处理程序中调用,并记录每个程序遇到的错误.下面是我的代码.CREATE OR REPLACE PROCEDURE APMS.test_procedure ASprocedure write_error_log (errcode number, errstr varchar2) ispragma autonomous_transa...

推荐文章

热门文章

相关标签