首页 > 编程语言 >支付宝APP支付(java后台版)

支付宝APP支付(java后台版)

时间:2023-05-23 10:58:03浏览次数:36  
标签:支付宝 java String APP AlipayConfig return model public

本实例是基于springBoot框架编写

    一、流程步骤
         1.执行流程
           当手机端app在支付页面时,调起服务端创建订单(自己公司业务接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端得到参数后,调起支付宝支付环境支付,完成支付后后会调异步通知接口,此时需要给支付宝返回成功或者失败信息,
返回支付成功页面,完成整个支付流程。

二、java后台开发

①,添加依赖,我的是最新的sdk

<!-- 支付宝支付 -->
<dependency>
   <groupId>com.alipay.sdk</groupId>
   <artifactId>alipay-sdk-java</artifactId>
   <version>3.7.26.ALL</version>
</dependency>

②支付宝基本配置 AlipayConfig

**
 * 支付宝基础配置类
 */
public class AlipayConfig {

    // 1.商户appid
    public static String APPID = "20190.......";

    //2.私钥 pkcs8格式的
    public static String RSA_PRIVATE_KEY = "4HPo2O+dTYVyp2SNZ8xMpwJGBx/Y1hJu1f79GhRsx+9rEpFEiGoty1hMwo7NAXEXeLIP7GjaQQP95+AlizjfqtWil7x/c0vzHY+USn0BTM8Dg28jM6brSZ+k76miqw88uhnNZnenWvrYHRJQu3mm5Sp75CMyn5yZ4banhGxVdXucC2Qv23tYsJbwEPYaARiOAHXtVrsz8vZ0DmGrR2yHIqqmFOVzHsJdYaiiGsE0sKaq3g7LmlXrqdSCvgUaKORWPdCEaWO3hQYtaRoDA3Tmdqwo0cEJtr0rNTLKpt0LAgMBAAECggEAD0RzXDFt8Z6ITs83gsmkEbIYmnvdcXK81SS1gfupSzejGvyKj/oXyL1FCEH6/f2IABxHM5OW2dNTy9dh0HAprpJNGHOpMtfkfLr6M9DcpchGikwPHWMXezJl1+/xj3pThvJ8ZdOYIP8kp/HOSf16RH5i1IUe4N1hPJuWRBRj/+nJ3k7wbfJvG7SMWUOmuTi9iGaSwFBVKnirIubDMrbGjOXW8FU2xz6IWqkTWXiRWkhOhd6lUA21QqjikQxF3LsrmIRV3mieTYbjpmr71nTkh590bEnIBbDQQL10s433HbXTL5PVdYOBZU/j+FQewBbNTpMVDQ+f+tEKTk9MwMOuKQKBgQDqxAawGdLuX8rTJuskc9DcDY1CqXs+jydlgxKNttwIc8BipW00j0JC+y7n+Jw2XqDqS5RZk9qD0AUDdG0BC81HHBwh3+KlzF/kqtQsOEu9PANlTVx8dBH52biiUFNms37UvnBh6240oYjOZD1ALby3J8wWhU/CdPi/9hQf0LW9RQKBgQCkpD59j8WPTOhEhGxMoHtBWHDujEEzpOfBNRlTTHF8p/DTWIADB+H5xwbXFPjydW4iMzv4jSHtISvnGmg1b0QNP3QmoCpq/QmH2Z8hRLwCmXRt1pBuoTTET4eGwdyqsqbICPLTBZIxBkB3SOqt5yP/ZqcLiA3y5dNO24XvKfsODwKBgBlD4WhgTxgCTSSuQo4YvLiB6NrsvGu+IkJFeeCwdjueoWy8WuVWKY5l0+V5Fu6u/mhYm+2MAO9AmtmFVRnQuFXXy5tFqfGn7gYA8HaV1GjYJZFoYvSt1SVrbfhh5qfd119z40pWePTHEZ8MoJ7gjTe027zsuem2hvK5u+60mmp1AoGAS0fGQwdQH/vcYCfklQz0DqbvzENZNNH8Hf23fL0BTyxDE3/t2HTsQJdea03tnn9PQlgG3dk6YADA4ETUzUn45c3TwC2P96eHihRZjI6vIMkl0WtAUzVmuTRcFaPi0DIrzF87GH39oGjpZSF0HNwJO6imTMGDD0NC4VXC4d5iKsUCgYEAt11UkZwgNGqtGp7UnyU3jWIO1hXRFVf4NogkFxnfPAs0DSeIRvqqBROQBxtpYFXPv9gXNelHZ/iOBtE3PSP+/rYvdBY1VmvBsZb40D3bUMeD8P1/ctxqeyqUUUrlIn8Fdi3hk8pNpwyOE0UyFMGlMFAfLCwVDu1nGCjjypJhVA0=";

    // 3.支付宝公钥
    public static String ALIPAY_PUBLIC_KEY = "a6Hd6aeqN7mTAKoZcArHnwWjtaGok312sFyY0tNgXTeG9fVE/2XxQHiqdNKprU1YYDTNrcsHkt3hyzF9X7lNeSCtIt6oTVSSzYAEcz+h0eYncLoKimeR1/2R6Kku/2FuOyB8rOti4s8ornkieR2gCRziDI3u3QwRAytfQch2PkqbyDGq6/QZl0Ft3Nf1ywmnwQG4b4oZhH4BIt+Ilmda9bY+pezCj4C1+M4anY1PQkXVREF0M5l9V3UJjz4Mrv0N/iMPXdlIP60soojITIJIQkzxbwIDAQAB";

    // 4.服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "http://xxx/appAlipay/notifyUrl";

    //5.页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址
    public static String return_url = "http://xxx/return_url.do";

    // 6.请求支付宝的网关地址
    public static String URL = "https://openapi.alipay.com/gateway.do";

    // 7.编码
    public static String CHARSET = "UTF-8";

    // 8.返回格式
    public static String FORMAT = "json";

    // 9.加密类型
    public static String SIGNTYPE = "RSA2";
}

③然后就是自己的逻辑代码,创建订单

/**
 * 支付宝app支付
 */
@RestController
@RequestMapping("/appAlipay")
public class AppAlipayController extends BaseController {

  

    /**
     * 统一下订单签名
     *
     * @param orderId 订单id
     * @return
     */
    @RequestMapping("/signParams")
    public ResultJson signParams(@RequestParam Long orderId) {
        logger.info("appAlipay/signParams");
        try {

           //自己的业务逻辑创建订单
              、、、、、、、、、
            //实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型),为了取得预付订单信息
            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);
            //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
            //SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
            //业务参数传入,可以传很多,参考API
            //model.setPassbackParams(URLEncoder.encode(request.getBody().toString())); //公用参数(附加数据)
            model.setBody(body.toString());//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
            model.setSubject(subject.toString());//商品名称
            model.setOutTradeNo(Long.toString(orderId));////商户订单号
            model.setTimeoutExpress("30m");//交易超时时间
            model.setTotalAmount("0.01");//支付总金额
            model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码,商家和支付宝签约的产品码
            request.setBizModel(model);
            request.setNotifyUrl(AlipayConfig.notify_url);//异步回调地址(后台)
            //这里和普通的接口调用不同,使用的是sdkExecute
            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
            String orderString = response.getBody();//就是orderString 可以直接给客户端请求,无需再做处理。
            return successs(orderString);
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return errorr(CodeMsg.PAY_FAIL);
        }
    }
}

④支付支付成功后,调用后台异步通知接口

 /**
     * 异步通知处理
     *
     * @param request
     * @return
     */
    @RequestMapping(value = "notifyUrl", method = RequestMethod.POST)
    public String notify(HttpServletRequest request) {
        try {
            //获取支付宝POST过来反馈信息
            Map<String, String> params = new HashMap<String, String>();
            Map requestParams = request.getParameterMap();
            for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                String name = (String) iter.next();
                String[] values = (String[]) requestParams.get(name);
                String valueStr = "";
                for (int i = 0; i < values.length; i++) {
                    valueStr = (i == values.length - 1) ? valueStr + values[i]
                            : valueStr + values[i] + ",";
                }
                //乱码解决,这段代码在出现乱码时使用。
                //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
                params.put(name, valueStr);
            }
            //签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
            //切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
            //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);

            //对验签进行处理
            if (signVerified) {  //验签通过
                if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {//只处理支付成功的订单: 修改交易表状态,支付成功
                    //业务处理
                    String out_trade_no = params.get("out_trade_no");            // 商户订单号
              
                    return "success"; //成功
                } else {//支付失败
                    return "fail";
                }
            } else {// 验证失败
                return "fail";
            }
        } catch (AlipayApiException e) {
            e.printStackTrace();
            return "fail";
        }
    }

五,到此支付支付完成。

标签:支付宝,java,String,APP,AlipayConfig,return,model,public
From: https://www.cnblogs.com/fenghd/p/17422634.html

相关文章

  • Yii2-app-advanced的配置文件优先级
    Yii2高级模板中支持多套环境配置,并且有优先级重写覆盖默认有两种dev和prod,在应用目录environments 下Yii2中的config配置文件(main.php和params.php)具有极大的灵活配置,结合配置文件的加载顺序1、使用约定 -应用目录下有config/main.php和params.php是一个全职全集......
  • Java开发Lombok使用详解
    转:https://www.jb51.net/article/198920.htm什么是LombokLombok是一款Java开发插件,可以通过它定义的注解来精简冗长和繁琐的代码,主要针对简单的Java模型对象(POJO)。好处就显而易见了,可以节省大量重复工作,特别是当POJO类的属性增减时,需要重复修改的Getter/Setter、构造器方法、eq......
  • Java开发笔记之将一个List拷贝到另一个List的问题
    0x00概述在对List数据进行不同的数据操作的时候,例如分支1将List按照A来排序,分支2将List按照B来排序,需要将List进行数据层面的拷贝; 0x01错误的操作仅仅是List的引用,并没拷贝List内的数据进行处理List<String>list1=newArrayList<>();List<String>list2=newArrayL......
  • 局域网通讯app有哪些?企业在选择的时候需要考虑哪些因素?
    随着科技的不断发展,人们的通讯方式也在不断地更新换代。在现今社会中,人们无论是工作还是生活,都需要经常进行通讯。而对于一些公司或者团队内部来说,局域网通讯app成为了他们不可或缺的工具。那么,局域网通讯app有哪些呢?  飞鸽传书 飞鸽传书是一款专门为局域网通讯设计的软......
  • 用chatGPT快速开发java后端功能
     接到一个紧急需求如图常规无非是建表,写接口,写测试类,最后造数据进行自测。突发奇想,要不用GPT4试一下快速写业务代码? 写句子1分钟,建表和得到代码1分钟第一步:建表,直接复制excel中内容到GPT中 第二步:要求转为下划线:  第三步:给出条件和想要的结果(下面第一幅图是自己写......
  • java.lang.IndexOutOfBoundsException: Invalid range
    报文:ERROR:17:38:36,099-TcLogger$IC_PrintStream.logButCheckForException:?java.lang.IndexOutOfBoundsExceptionjava.lang.IndexOutOfBoundsException:Invalidrange atjavax.swing.DefaultRowSorter.rowsUpdated(UnknownSource) atjavax.swing.DefaultRowSor......
  • 一篇文章告诉你什么是Java内存模型
    在上篇并发编程Bug起源:可见性、有序性和原子性问题,介绍了操作系统为了提示运行速度,做了各种优化,同时也带来数据的并发问题,定义在单线程系统中,代码按照顺序从上往下顺序执行,执行不会出现问题。比如一下代码:inta=1;intb=2;intc=a+b;程序从上往下执行,最终c的结果......
  • java学习日记20230522-TreeSet
    有序键值对集合publicclassTreeSetExercise{publicstaticvoidmain(String[]args){Integerinteger=newInteger(10);TreeSettreeSet=newTreeSet(newComparator(){@Overridepublicintcompare(Objecto1,Obj......
  • java学习日记20230522-集合选择原则
    1.判断存储的类型,一组对象【单列】或者一组键值对【双列】2.一组对象【单列】:collection的子类:允许重复:List的某个实现类:增删多LinkedList(底层维护的是双向链表)                                改查多ArrayList(底层维护的是object类型的可......
  • JavaScript函数
    1函数定义使用function关键字来定义,即functionfName(para,...){statment;...;},可使用在函数声明语句与函数定义表达式这两种形式中函数名称标识符fName。是函数声明语句必需的部分。它的用途就像变量的名字,新定义的函数对象会赋值给这个变量但对函数定义表达式来说......