支付宝--扫码支付流程

1.首次知道,原来(支付宝支付接口)需要去蚂蚁金服开发者帮助文档(尴尬)。

附带链接地址:https://docs.open.alipay.com

2.创建自己的应用,我选的是【自研接入】(这是一个坑,如果不是企业级应用,不能签约,所有扫码支付功能并不能使用),创建应用的时候选择【支付接入】

3.有一个很坑爹的步骤:上传图标的时候,在屏幕的最右边有一个编辑按钮(我的天,我还以为我发现支付宝的一个BUG呢)

(注:上传图标要注意(不能为人物和动物头像))

4.生成RSA 密钥,下载支付提供的工具(windows 和 mac 俩个版本),生成以后,点击工具右下角有一个上传公钥,这里我详细的说一下,一共有三个(俩个是我们自己生成的,公钥,私钥,这俩个上传之后会生成一个支付的公钥)。

5.所有之前的都是准备工作,下面才是重头戏,支付宝提供的是SDK,但是我们使用的是maven 搭建的spring-boot项目,所以我们先找一下有没有支付宝maven 依赖。 



    com.alipay.sdk
    alipay-sdk-java
    3.4.27.ALL

6.在这里我还要提一下,我自己要做的事情,是支付宝扫码支付,所以我贴上一张支付流程图

支付宝--扫码支付流程_第1张图片 支付宝扫码支付流程图

 

7.本地如果想调用第三方接口,需要有自己的域名,或者配置内网穿透(我下载的是花生壳,想必大家都听说过哈 ,当然也不是免费的 6块大洋)

8.我们要调用第三方的接口,需要组装对应的AlipayTradePrecreateRequest请求 

9.然后调用支付宝的响应请求AlipayTradePrecreateResponse ,下单(这个单官方已经给您解释了,按照人家规定的组装就可以了)

10.截取一些比较重要的代码环节

常用参数配置类

public class AlipayConfig {
    //ServiceURL 设置网关
    public static String ServiceUrl="https://openapi.alipay.com/gateway.do";
    //APP支付宝支付业务:app_id
    public static String app_id = "你的项目APPID";//例:2016082600317257
    // 商户的私钥,使用支付宝自带的openssl工具生成。
    public static String private_key = "你的私钥";
    // 应用的公钥,无需修改该值
    public static String ali_public_key = "";
    // 支付宝的公钥,去open.alipay.com对应应用下查看。
    public static String zfb_public_key="";
    // 字符编码格式 目前支持 gbk 或 utf-8
    public static String input_charset = "UTF-8";
}

二维码生成 Controller

   @RequestMapping(value="/alipay")
    @ApiOperation(value = "支付宝支付--下订单--返回二维码数据流")
    public String  ailipay(@RequestParam @ApiParam(required = true,name = "车牌号码") String licensePlateNumber,HttpServletResponse servletResponse) throws AlipayApiException {
        // 拼装客户端
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.ServiceUrl,AlipayConfig.app_id,
                AlipayConfig.private_key,"json",AlipayConfig.input_charset,AlipayConfig.zfb_public_key,"RSA2");
        // 支付宝 request
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        String subject = "华安停车支付宝支付测试";
        String totalAmount = "0.01";
        String storeId = "123";
        AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
        model.setSubject(subject);
        model.setTotalAmount(totalAmount);
        model.setStoreId(storeId);
        model.setTimeoutExpress("5m");
        //商品订单号码 out_trade_no 商户订单号,64个字符以内、只能包含字母、数字、下划线;需保证在商户端不重复
        model.setOutTradeNo(UUID.randomUUID().toString());
        request.setBizModel(model);
        //request.set
        // 支付宝 response 这里已经对相应结果解析了。返回值
        AlipayTradePrecreateResponse response = alipayClient.execute(request);
        if(response.isSuccess()){
            System.out.println("调用成功");
            String code = response.getQrCode();
            //二维码数据流
            System.out.println(code);
            ZxingUtils.writeToServletFile(code,servletResponse);
        } else {
            System.out.println("调用失败");
        }
        return "Success";
    }

支付宝的二维码需要自己生成的,官方下载的Demo中也有Zxing的工具类(我改良了一下,主要是用于web页面显示二维码)

public static void writeToServletFile(String contents, HttpServletResponse resp){
    try {
        Map hints = new Hashtable();
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        hints.put(EncodeHintType.CHARACTER_SET, "UTF8");
        BitMatrix bitMatrix = new MultiFormatWriter().encode(contents, BarcodeFormat.QR_CODE,
                200, 200, hints);
        MatrixToImageWriter.writeToStream(bitMatrix, "png", resp.getOutputStream());
    } catch (Exception e) {
        e.printStackTrace();
    }

}

这是Zxing所需要的 maven 依赖

       
        
            com.google.zxing
            core
            3.3.3
        
        
            com.google.zxing
            javase
            3.2.0
        

页面可以用img标签就可以接受我们转换的流文件(inputStream)




    
    测试二维码生成


    

测试二维码生成

//这个地址是我通过花生壳转换过的域名

我们看一下页面展示效果

支付宝--扫码支付流程_第2张图片

最后我们需要写一下支付成后以后的回调用地址(这里面有一个验签的过程提供很多种方法)

    /**
     * @Author : wangjian
     * @Description 支付回掉URL
     * @Date  2018/11/5 14:31
     * @Param [licensePlateNumber]
     * @Return java.lang.String
     **/
    @RequestMapping("/aliPayCallBack")
    public String aliPayCallBack(HttpServletResponse response, HttpServletRequest request){
        try {
            Map params = new HashMap();
            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);
            }
            boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.zfb_public_key, AlipayConfig.input_charset,"RSA2");
            String trade_status = request.getParameter("trade_status"); // 交易状态

            String order_no = request.getParameter("out_trade_no"); // 获取订单号
            log.info("回调过程获取的订单编号:{}" ,order_no);
            // 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//
            if (flag==true) {// 验证成功
                System.out.println("支付宝订单支付成功!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("支付异常^-^");
        }
        return "";
    }

最后还要稍微提一下,支付宝的沙箱测试(个人认为这也是比微信支付更牛逼的地方)

沙箱环境:在我理解看来就是一个模拟支付的流程(里面可以模拟各种支付)

1.需要下载对应的支付宝APP(文档上有二维码,当然目前只支持安卓手机下载)

2.下载好对应的APP以后,需要在支付宝开发里再次上传一下自己的公钥,然后获取支付宝对应的公钥,重新分配一个APPID,

支付宝网关同时也需要改(后面加了一个dev ),看好哟。

3.改完之后就可以随便测试了

好了,以上就是支付宝的扫码支付的全部流程了,完成了简单的支付流程,当然所有的代码都是撸在controller中,也没有连接

数据库,我是以一个小白的来自这件事情的,希望后续有人看了会对你有所帮助。

你可能感兴趣的:(源码分析)