Java实现支付宝当面付(扫码)详细步骤

当咱们申请签约好当面付功能之后怎么用Java代码调用该支付接口呢?我只创建了三个Java类。

controller  commen qrcode

controller用来写调用支付接口的,commen用来写全局变量,例如APPID,URL这些。

qrcode是生成二维码的工具类,因为在当面付的官方说明文档里写着要开发者用工具转换返回的链接生成二维码,所以这里用到一个生成二维码的工具类。

看图:

commen

qrcode

controller

@GetMapping("/alipay")
public void demo (HttpServletResponse response2) throws Exception {
    AlipayClient alipayClient = new DefaultAlipayClient( Commen.URL ,  Commen.APPID ,  Commen.APP_PRIVATE_KEY ,  Commen.FORMAT,  Commen.CHARSET ,  Commen.ALIPAY_PUBLIC_KEY ,  Commen.SIGN_TYPE );  //获得初始化的AlipayClient
    AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest (); //创建API对应的request类
    request.setNotifyUrl("http://mk9zr5.natappfree.cc/cs/retrun");//设置回调通知地址
    request.setReturnUrl("http://www.baidu.com");
    request . setBizContent ( "{"   +
            "\"out_trade_no\":\"20150320010101018\"," + //商户订单号
            "\"total_amount\":\"0.01\","   +
            "\"subject\":\"Iphone6 16G\","   +
            "\"store_id\":\"NJ_001\","   +
            "\"timeout_express\":\"90m\"}" ); //订单允许的最晚付款时间
    AlipayTradePrecreateResponse response = null;
    try {
        response = alipayClient.execute (request);
    } catch (AlipayApiException e) {
        e.printStackTrace();
    }
    //根据response中的结果继续业务逻辑处
    Map map = JsonToMapUtil.analysis(JSON.parseObject(response.getBody()));
    Qrcode.produceQR(response2,map.get("qr_code")+"");
}

我在这里设置了回调通知地址是用的内网穿透的一个地址,实际上是我本地localhost,回调方法如下:

@PostMapping("/retrun")
    public void callback(HttpServletRequest request,HttpServletResponse response) throws Exception {
        InputStream inStream = request.getInputStream();
        BufferedReader in = null;
        String result = "";
        in = new BufferedReader(
                new InputStreamReader(inStream));
        String line;
        while ((line = in.readLine()) != null) {
            result += line;
        }
        Map<String,Object> map = new HashMap<>();
        String[] split = result.split("&");
        for (String s : split) {

            String[] spl = s.split("=");
            String key = spl[0];
            String value = URLDecoder.decode(spl[1], "UTF-8");// UTF-8解码
            map.put(key,value);
        }
//        打印success字节流传给支付宝服务器
        System.out.println("================================= 支付成功 =================================");
        Writer out= new BufferedWriter(new OutputStreamWriter(response.getOutputStream()));
        out.write("success"); //一定要打印success
        out.flush();
        out.close();
        System.out.println("付款时间是"+map.get("gmt_payment"));
        System.out.println("支付宝交易订单号"+map.get("trade_no"));
        System.out.println("商户订单号"+map.get("out_trade_no"));
        System.out.println("订单金额"+map.get("total_amount"));
        System.out.println("订单状态"+map.get("trade_status"));
        System.out.println(map.toString());
    }

回调的意思是用户扫码付款成功后,会有一个异步通知,是支付宝官方通知我们用户已经支付成功了,我们需要给支付宝一个回调的地址让他有地方通知过来。然后我是写成了map,一个一个打印出来了。

详细的代码已经上传了,只需要更改你的APPID参数即可:https://download.csdn.net/download/weixin_42167600/19988100

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java-小胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值