Java简单调用支付宝当面付生成支付二维码_广州老实人的博客-程序员宅基地_alipaytradeprecreaterequest

技术标签: 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

智能推荐

redis实现并发资源控制--如抢红包、抢优惠券机制_xiaoliang330的博客-程序员宅基地

[b]场景:如 抢红包、 抢优惠券,都是先到先得[/b][color=blue]抢红包是把发出来的红包先分成预设的份数,预先处理好了每个红包的金额大小,然后将分配好的红包装进一个队列当中,等待哄抢(并发的可能)抢优惠券也是预先生成了若干的优惠券,然后将所有生成的优惠券码放进一个队列当中,等待领取(并发的可能)[/color][color=red][b]现用r...

流畅的python学习记录——第七章:函数装饰器和闭包_Nick Blog的博客-程序员宅基地

流畅的python学习记录——第一章:python数据模型流畅的python学习记录——第二章:数据结构——序列构成的数组流畅的python学习记录——第三章:字典和集合流畅的python学习记录——第四章:None流畅的python学习记录——第五章:一等函数流畅的python学习记录——第六章:None流畅的python学习记录——第七章:函数装饰器和闭包流畅的python学习记录——第八章:None7.1 简介装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代.

1X1的卷积核的作用_徐梓航的博客-程序员宅基地

reference:https://blog.csdn.net/a1154761720/article/details/53411365https://blog.csdn.net/chaipp0607/article/details/60868689 

微信开发者工具刷新后重复请求两次_xiaolin9902的博客-程序员宅基地

今天在调试一个微信公众号的项目,用微信开发者工具做调试。有一个页面我一点击刷新,后台就会断点两次。有什么重定向的地方我不知道么?于是去掉微信浏览器的限制,直接将地址拷贝到chrome里面,不会重复请求。然后又改用菜单里面的刷新,也没有重复请求。看来是微信开发者工具的bug,用菜单里面的刷新吧。...

ceil floor round_shx6666的博客-程序员宅基地

ceil 向上取整floor 向下取整round 四舍五入

OSAL机制的ZigBee低功耗管理(CC2530)_xiao11xiang123的博客-程序员宅基地

OSAL机制的ZigBee低功耗管理(CC2530)(转载)涉及文件OSAL_PwrMgr.h       OSAL电源管理的API头文件OSAL_PwrMgr.C      OSAL电源管理的API C文件hal_sleep.c                底层的电源管理文件 电源管理结构体typedef struct{

随便推点

Nginx开发一个简单的HTTP过滤模块_xiaofei0859的博客-程序员宅基地

转载:http://blog.csdn.net/zhangxiao93/article/details/53691642记录为了学习开发一个HTTP过滤模块的步骤和相关知识跟开发一个普通的HTTP模块是类似的,只不过HTTP过滤模块的地位、作用与正常的HTTP过滤模块不同,它的工作是对发送给用户的HTTP响应包做一些加工。本文将学习开发一个简单的HTTP过滤模块,它能够对C

dijkstra堆优化模板_大大大大大板牙的博客-程序员宅基地

#include&lt;bits/stdc++.h&gt;using namespace std;int xx,yy,vv,dis[510],len=0,lin[510],T,n,m;bool vis[510];struct one{int y,v,next;};one e[20100];//priority_queue &lt; pair &lt; int , int &gt; , vector , greater &gt; q;priority_queue &lt; pair &lt

ios最好用的第三方分享集成框架_IOS开发乐园的博客-程序员宅基地

ios最好用的第三方分享集成框架ios一般项目中都会有第三方分享功能,微信好友 朋友圈 新浪微博 分享 链接,图片,音频,视频等。于是自己弄个demo:XFThirdShareSDKDemo。一句代码实现第三方分享,超方便好用。一、功能描述该demo集成了微信SDK,新浪微博SDK,主要功能是:微信好友、微信朋友圈、新浪微博 分享 图片、链接、音频等的集成与封装。二、dem...

cond与if_xiangjie256的博客-程序员宅基地

[code=&quot;lisp&quot;](define (f x) (cond ((&gt;= x 0) (- x))) (cond ((&lt; x 0) x)) )(define (f1 x) (if (&lt; x 0) (- x) x))&gt; (f -1)-1&gt; (f1 -1)1&gt; [/code]cond相当于c,c++中...

abc-239 E(多想想数据范围的暗示)_先求一个导的博客-程序员宅基地

题目题意: 给定以1为根的树,树上每个点有点权x[i].有Q次询问,每次查询为i为子树树根中第k大的点权值.(n&lt;=1e5,k&lt;=20)思路: 仔细观察k最大为20,暗示我们什么呢?暗示dfs时可以只将儿子最大的20个与父节点最大的20个比较,更新父节点信息。每个点会被搜到一次,每个点用2klog(2k)时间排序更新前20大的数。而且,vector从0开始,我的第i大从1开始,调bug调了半天。lao的一时间复杂度: O(nk*log(k)),题解说log(nk),不知道怎么算的QAQ.

推荐文章

热门文章

相关标签