spring boot 支付宝沙箱支付实现,易错点 不能用ajax;电脑网站支付

荒凉一梦 提交于 2020-02-15 16:24:19

沙箱支付:沙箱不是线上,是协助开发者进行接口功能开发及主要功能联调的模拟环境:

坑:

  • application.properties中 不能用 _ 会提示找不到应该用 - 连接(alipay-public-key)
  • 点击支付后跳转的页面不能用ajax的get请求实现

一:DEMO运行沙箱

看见demo可以先下载运行,然后仿照其代码在这里插入图片描述
参考文档:当面付≠电脑支付;只是借鉴当面付的步骤来看懂电脑支付的DEMO
沙箱当面付引导
电脑网站支付Demo

1.打开沙箱

开发者中心》研发服务
打开沙箱
发现有demo:下载下来尝试

2.填写密钥

参考文档
商户密钥:商户和支付宝双方
应用(APP)公钥:商户自己生成的APK,需要上传,用于验证此次交易是不是商户发起的
应用(APP)私钥:商户自己生成的,对请求字符串进行标签。
开发者(商户)密钥配置后可以获取支付宝公钥
支付宝公钥(ALIPAY):商户验证结果是不是支付宝返回的额
1.下载支付宝开放平台开发助手并生成应用私钥应用公钥
在这里插入图片描述
2.在沙箱环境中填写密钥信息:并获得支付宝公钥
在这里插入图片描述
支付宝网关:open_api_domain
3.将demo导入eclipse:修改demo中的zfbinfo.properties
(电脑支付的话直接对着它的demo改更好)不要用这个当面付的demo
在这里插入图片描述

当面付(电脑支付不看这里,电脑版的会自动生成支付码):

4.运行main在这里插入图片描述
5.得到qr_code,打开浏览器百度草料二维码复制获得二维码
在这里插入图片描述
6.按照使用安卓手机 下载的沙箱支付宝:用沙箱账号登录并且付款发现成功

电脑支付(当面付不用看):

将当面付中的properties内容对应复制到电脑支付AlipayConfig中;运行即可;直接弹出这个网页:
在这里插入图片描述
后文写的是两种结合的:因为不想在创建一个AlipayConfig;
在properties中写先执行构造方法,再注入成员变量 所以不能再构造方法中使用@Value来的变量;

二:项目部署沙箱

我是网页所以应该是电脑网站支付:

sdk软件开发工具包括广义上指辅助开发某一类软件的相关文档、范例和工具的集合。API(应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。
参考电脑支付DEMO
在这里插入图片描述

前端:

profile.html
还需要传递页面上的总额,数量所以用 location.href

<a class="btn btn-success" href="javascript:;" th:data-id="${order.id}" onclick="dobuy(this)">购买</a>

function dobuy(e) {
      var id = e.getAttribute("data-id");
      var price = parseFloat($("#thisSum"+id).text());
      var count = parseInt($("#inputNum"+id).val());
      console.log("id="+id+",total="+price+",count="+count);
     /* $.ajax({
          type: "GET",
          url: "/order",
          dataType: "JSON",
          contentType: 'application/json',
          data: {
              "id": id,
              "total":price,
              "amount":count
          },
          success:function (ret) {
              console.log(ret)
          }

      })  不能用AJAX!!!!!!!!!!*/
     location.href="/order?id="+id+"&total="+price+"&amount="+count;
  }

a标签是直接访问跳转到文件url,浏览器判断是个可下载文件就会自动下载。get是ajax,只能返回string类型的数据,而写出页面渲染url是一个对应的是一个文件流,ajax接收不到。
一定不能用ajax

配置文件

application.properties
直接添加上一个demo中的 ALIPAY的属性,之后在需要的地方用@Value获取

    @Value("${open-api-domain}")
    private String serverUrl;
    @Value("${appid}")
    private String appId;
    @Value("${private-key}")
    private String privateKey;
    @Value("${alipay-public-key}")
    private String alipayPulicKey;
    @Value("${return-url}")
    private String returnUrl;
    @Value(("${nofity-url"))
    private String notifyUrl;
//服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// 这个是支付成功失败以后的通知接口会返回相应的参数
nofity-url = http://localhost:8222/order/notify

//页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
// 这个是支付完成后的请求
return-url = http://localhost:8222/order/return

// 该笔订单允许的最晚付款时间,逾期将关闭交易。取值范围:1m~15d。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。 该参数数值不接受小数点, 如 1.5h,可转换为 90m。
timeout-express =30m;

后端

controller

	@ResponseBody
    @RequestMapping(value = "/order" ,produces = "text/html; charset=UTF-8")
    public String doBuy(@RequestParam("id")Long id,
                        @RequestParam("amount")Integer amount,
                        @RequestParam("total")Float total,
                        HttpServletResponse response){
        AlipayClient alipayClient = alipayProvider.createClien();
        Orders thisOrder = orderService.updateOrderById(id, amount);
        AlipayTradePagePayRequest alipayRequest = 	alipayProvider.trade_precreate(thisOrder, total);

        String result = null;
        try {
            result = alipayClient.pageExecute(alipayRequest).getBody();

        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return result;
    }
    
    /**
     * notify.url.jsp
     * @param request
     * @param response
     * @param model
     * @return
     */
    @RequestMapping("/order/notify")
    public String doPost(HttpServletRequest request,
                         HttpServletResponse response,
                         Model model){
                        demo中notify.url.jsp中的代码
                         }}
    /**
     * 支付成功
     * return_url.jsp
     * @param request
     * @param response
     * @return
     */
    @RequestMapping("/order/return")
    public String doGet(HttpServletRequest request,
                        HttpServletResponse response,
                        Model model)
         demo中return_url.jsp中的代码   
         还可以加上删除该成功的订单以及商品 加通知给卖家,买家等。
         return "redirect:/"; 我选择返回首页
         }             

Proveder(AlipayProvider)

package com.cassiezys.transaction.provider;
/**
 * Copyright,2020
 * Author:曾念念
 * Description:支付宝沙箱支付
 */
@Component
public class AlipayProvider {

    @Value("${open-api-domain}")
    private String serverUrl;
    @Value("${appid}")
    private String appId;
    @Value("${private-key}")
    private String privateKey;
    @Value("${alipay-public-key}")
    private String alipayPulicKey;
    @Value("${return-url}")
    private String returnUrl;
    @Value("${nofity-url")
    private String notifyUrl;
    @Value("${timeout-express}")
    private String timeout_express;

    //实例化客户端
    AlipayClient alipayClient;

    public AlipayClient createClien() {
        System.out.println(serverUrl);
        this.alipayClient = new DefaultAlipayClient(serverUrl, appId, privateKey, "json", "utf-8", alipayPulicKey, "RSA2");
        return alipayClient;
    }
	
	/**
     * 创建支付码
     * @param order 
     * @param total
     * @return
     */
    public AlipayTradePagePayRequest trade_precreate(Orders order, Float total) {

        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(returnUrl);
        alipayRequest.setNotifyUrl(notifyUrl);
//——请在这里编写您的程序(以下代码仅作参考)——
//业务逻辑部分(请开始你的数据调用)
        //商户订单号,商户网站订单系统中唯一订单号,必填
        String out_trade_no = "zhenbao" + System.currentTimeMillis() + (Math.random() * 10000000L) +"-"+ order.getId().toString();
        //付款金额,必填
        String total_amount = total.toString();
        //订单名称,必填
        String subject = order.getOuterTitle();
        //商品描述,可空
        String body = "商品描述(自定义)";
        System.out.println(timeout_express);
        alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
                + "\"total_amount\":\"" + total_amount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"body\":\"" + body + "\","
             //*   + "\"timeout_express\":\""+ timeout_express +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        return alipayRequest;

    }
    
	/**
     * notify 和 return 中需要得到 支付宝返回过来的信息
     * @param params
     * @return
     */
    public boolean signature(Map params) {
        try {
            return AlipaySignature.rsaCheckV1(params, alipayPulicKey, "utf-8", "RSA2"); //调用SDK验证签名
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        return false;
    }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!