支付宝沙箱支付

1、支付宝沙盒操作,首先打开支付宝沙盒网页沙箱应用 - 开放平台

查看密钥

 

自定义密钥,

第一步下载支付宝开发平台密钥

密钥工具下载 - 支付宝文档中心

 

下载完成,点击生产密钥

 

第二步,将生产的公钥复制粘贴到网页的自定义密钥中

 

2、 进行内网穿透,(内网穿透的目的是让支付宝可以调用你的接口,给你返回支付信息,必须把启动端口暴露到公网中)

第一步:打开NATAPP-内网穿透 基于ngrok的国内高速内网映射工具

购买一个免费的隧道

第二步:配置要暴露的端口

第三步:下载软件,解压,查看是否有 start.bat启动项,没有创建一个,填写以下内容

natapp.exe -authtoken=#{你的authtoken}

3、java中使用

1、引入依赖

        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-easysdk</artifactId>
            <version>2.2.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.35.79.ALL</version>
        </dependency>

2、配置项

alipay:
  #沙箱id
  appId: 2021000147677127
  #商户私钥
  appPrivateKey: #{你的商户私钥}
  #支付宝公钥
  alipayPublicKey: #{你的支付宝公钥}
  #响应地址
  notifyUrl:  http://#{你的内网穿透地址}/alipay/notify
  #返回地址
  returnUrl: http://
  #加密算法
  signType: RSA2
  charset: utf-8
  format: json
  # 支付宝网关地址
  gatewayUrl: https://openapi-sandbox.dl.alipaydev.com/gateway.do

3、Alipay配置类

@Data
@ConfigurationProperties(prefix = "alipay")
public class AlipayProperties {
    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    private String appId;

    // 应用私钥,就是工具生成的应用私钥
    private String appPrivateKey;
    // 支付宝公钥,对应APPID下的支付宝公钥。

    private String alipayPublicKey;

    // 支付宝会悄悄的给我们发送一个请求,告诉我们支付成功的信息
    private String notifyUrl;

    //同步通知,支付成功,一般跳转到成功页
    private String returnUrl;

    // 签名方式
    private String signType;

    //返回类型
    private String format;

    // 字符编码格式
    private String charset;

    //订单超时时间
    private String timeout = "1m";

    // 支付宝网关
    private String gatewayUrl;
}

4、配置

@EnableConfigurationProperties(AlipayProperties.class)
@Component
@Data
public class AlipayTemplate {
    @Autowired
    private AlipayProperties alipayProperties;

    public AlipayClient alipayClient() {

        //根据支付宝的配置生成一个支付客户端
        return new
                DefaultAlipayClient(alipayProperties.getGatewayUrl(), alipayProperties.getAppId(), alipayProperties.getAppPrivateKey(),
                alipayProperties.getFormat(), alipayProperties.getCharset(), alipayProperties.getAlipayPublicKey(), alipayProperties.getSignType());
    }
}

5、order类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Order implements Serializable {

    /**
     * 订单编号
     */
    private Long orderNo;

    /**
     * 用户Id
     */
    private Long userId;

    /**
     * 订单名称
     */
    private String goodsName;

    /**
     * 支付金额
     */
    private Double money;

    /**
     * 支付方式
     */
    private String paymentMethod;

    /**
     * 0 - 未支付 1 - 已支付
     */
    private Integer status;


    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 更新时间
     */
    private Date updateTime;

    /**
     * 是否删除
     */
    private Integer isDelete;

    private static final long serialVersionUID = 1L;
}

6.支付接口 

/**
 * 支付宝接口
 */
@RestController
@RequestMapping("/alipay")
public class AliPayController {

    @Autowired
    AlipayTemplate alipayTemplate;
    @Autowired
    AlipayProperties alipayProperties;

    @GetMapping(value = "/pay", produces = "text/html")
    @ResponseBody
    public String pay(@RequestParam long id, HttpServletResponse httpResponse) throws AlipayApiException, IOException {
        //假定的数据
        Order order = new Order();
        order.setOrderNo(id);
        order.setUserId(129904058947L);
        order.setGoodsName("水果");
        order.setMoney(10.0);
        order.setPaymentMethod("支付宝");


        //创建一个支付请求,并设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        //跳转路径
        alipayRequest.setReturnUrl(alipayProperties.getReturnUrl());
        //响应路径
        alipayRequest.setNotifyUrl(alipayProperties.getNotifyUrl());

        JSONObject bizContent = new JSONObject();
        //订单编号
        bizContent.put("out_trade_no",order.getOrderNo());
        //总金额
        bizContent.put("total_amount",order.getMoney());
        //商品名称
        bizContent.put("subject",order.getGoodsName());
        //设置支付时长
        bizContent.put("timeout_express",alipayProperties.getTimeout());
        //设置支付宝支付请求中的产品码
        bizContent.put("product_code","FAST_INSTANT_TRADE_PAY");
        System.out.println(bizContent.toString());
        alipayRequest.setBizContent(bizContent.toString());
        String result = "";
        try{
            result = alipayTemplate.alipayClient().pageExecute(alipayRequest).getBody();
        }catch (AlipayApiException e){
            e.printStackTrace();
        }
        //会收到支付宝的响应,响应的是一个页面,只要浏览器显示这个页面,就会自动来到支付宝的收银台页面
        System.out.println("支付宝的响应:" + result);
        /*httpResponse.setContentType("text/html;charset"+alipayProperties.getCharset());
        httpResponse.getWriter().write(result);
        httpResponse.getWriter().flush();
        httpResponse.getWriter().close();*/
        return result;
    }

    @PostMapping("/notify")  // 注意这里必须是POST接口
    public String payNotify(HttpServletRequest request) throws Exception {
        if ("TRADE_SUCCESS".equals(request.getParameter("trade_status"))) {
            System.out.println("=========支付宝异步回调========");

            Map<String, String> params = new HashMap<>();
            Map<String, String[]> requestParams = request.getParameterMap();
            for (String name : requestParams.keySet()) {
                params.put(name, request.getParameter(name));
                // System.out.println(name + " = " + request.getParameter(name));
            }

            String sign = params.get("sign");
            String content = AlipaySignature.getSignCheckContentV1(params);
            boolean checkSignature = AlipaySignature.rsa256CheckContent(content,sign,alipayProperties.getAlipayPublicKey(),"UTF-8");
            // 支付宝验签
            if (checkSignature) {
                // 验签通过
                System.out.println("交易名称: " + params.get("subject"));
                System.out.println("交易状态: " + params.get("trade_status"));
                System.out.println("支付宝交易凭证号: " + params.get("trade_no"));
                System.out.println("商户订单编号: " + params.get("out_trade_no"));
                System.out.println("交易金额: " + params.get("total_amount"));
                System.out.println("买家在支付宝唯一id: " + params.get("buyer_id"));
                System.out.println("买家付款时间: " + params.get("gmt_payment"));
                System.out.println("买家付款金额: " + params.get("buyer_pay_amount"));
                //TODO 更新订单状态
            }
        }
        return "success";
    }
}

只写了控制类,没有连接数据库操作,可以把支付接口的接受id,改成接受订单类,对数据库进行操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值