其他分享
首页 > 其他分享> > 支付宝扫码支付

支付宝扫码支付

作者:互联网

 扫码支付代码记录

1、支付宝依赖

        <!-- alipay sdk 支付依赖 -->
        <dependency>
            <groupId>com.alipay.sdk</groupId>
            <artifactId>alipay-sdk-java</artifactId>
            <version>4.13.0.ALL</version>
        </dependency>
        <!--依赖支付的空判断-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.10</version>
        </dependency>
        <!--二维码生成-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.0</version>
        </dependency>
        <!--加密依赖-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.11</version>
        </dependency>
        <!--http请求-->
        <dependency>
            <groupId>commons-httpclient</groupId>
            <artifactId>commons-httpclient</artifactId>
            <version>3.1</version>
        </dependency>

2、生成支付图片

参数:money为用户自己输入的充值金额 ,token为用户的key

public byte[] alipay(String money,String token) {
        try {
            // 业务数据
            // 1:支付的用户
            //String enterpriseId = token.substring(0,44);
            EnterpriseAccount account = enterpriseAccount.getAccountByToken(token);
            // 2: 支付金额

            // 3: 支付的产品
            String title = "xxxx充值!";
            // 4: 支付的订单编号
            String orderNumber = utils.getUUID();
            // 5:支付宝携带的参数在回调中可以通过request获取
            JSONObject json = new JSONObject();
            json.put("enterpriseId", account.getEnterpriseId());
            //json.put("orderNumber", orderNumber);
            json.put("money", money);
            json.put("ptype","prepaid");// 支付类型 预支付
            //json.put("packageId",enterprisePackage.getId());
            String params = json.toString();

            // 支付信息的参数
            // 6:设置支付相关的信息
            AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
            model.setOutTradeNo(orderNumber); // 自定义订单号
            model.setTotalAmount(money);// 支付金额
            model.setSubject(title);// 支付的产品名称
            model.setBody(params);// 支付的请求体参数
            model.setTimeoutExpress("30m");// 支付的超时时间
            model.setStoreId(account.getEnterpriseId()+"");// 商户门店编号
            QrCodeResponse qrCodeResponse = qrcodePay(model);


            //7 二维码合成
            ByteArrayOutputStream output = new ByteArrayOutputStream();
            String logopath = "";
            try {
                logopath = ResourceUtils.getFile("classpath:static/favicon.png").getAbsolutePath();
            }catch (Exception ex){
                logopath = new java.io.File("static/favicon.png").getAbsolutePath();
            }

            BufferedImage buffImg = QRCodeUtil.encode(qrCodeResponse.getQr_code(), logopath, false);//获取二维码
            ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);
            ImageIO.write(buffImg, "JPEG", imageOut);
            imageOut.close();
            ByteArrayInputStream input = new ByteArrayInputStream(output.toByteArray());
            return FileCopyUtils.copyToByteArray(input);
        } catch (Exception ex) {
            ex.printStackTrace();
            return null;
        }
    }


    /**
     * 扫码运行代码
     * 验签通过返回QrResponse
     * 失败打印日志信息
     * 参考地址:https://opendocs.alipay.com/apis/api_1/alipay.trade.app.pay
     *
     * @param model
     * @return
     */
    public QrCodeResponse qrcodePay(AlipayTradePrecreateModel model) {
        // 1: 获取阿里请求客户端
        AlipayClient alipayClient = getAlipayClient();
        // 2: 获取阿里请求对象
        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
        // 3:设置请求参数的集合,最大长度不限
        request.setBizModel(model);
        // 设置异步回调地址
        request.setNotifyUrl(notify_url);
        // 设置同步回调地址
        request.setReturnUrl(return_url);
        AlipayTradePrecreateResponse alipayTradePrecreateResponse = null;
        try {
            alipayTradePrecreateResponse = alipayClient.execute(request);
        } catch (AlipayApiException e) {
            e.printStackTrace();
        }
        QrResponse qrResponse = JSON.parseObject(alipayTradePrecreateResponse.getBody(), QrResponse.class);
        return qrResponse.getAlipay_trade_precreate_response();
    }
    /**
     * 获取AlipayClient对象
     *
     * @return
     */
    private AlipayClient getAlipayClient() {
        AlipayClient alipayClient =
                new DefaultAlipayClient(gatewayUrl, app_id, merchant_private_key,
                        "JSON", charset, alipay_public_key, sign_type); //获得初始化的AlipayClient
        return alipayClient;
    }

从nacos配置中心获取支付宝参数

import org.springframework.beans.factory.annotation.Value;
public class AlipayConfig {
    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    @Value("${alipay.app_id:}")
    public  String app_id;
    // 商户私钥,您的PKCS8格式RSA2私钥
    @Value("${alipay.merchant_private_key:}")
    public String merchant_private_key;
    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    @Value("${alipay.alipay_public_key:}")
    public String alipay_public_key;
    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    @Value("${alipay.notify_url:}")
    public  String notify_url;
    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    @Value("${alipay.return_url:}")
    public  String return_url;
    // 签名方式
    @Value("${alipay.sign_type:}")
    public  String sign_type;
    // 字符编码格式
    @Value("${alipay.charset:}")
    public  String charset;
    // 支付宝网关
    @Value("${alipay.gatewayUrl:}")
    public String gatewayUrl;
    // 日志存放
    @Value("${alipay.log_path:}")
    public String log_path;
}

 3、给支付宝设定的回调函数

当扫码支付后,支付宝调用回调函数把支付信息返回。

@RequestMapping("enterprisePay/notifyUrl")
    public String notifyUrl(HttpServletRequest request) throws Exception {
        // 1: 调用支付回调
        boolean result = enterprisePayCallback(request);
        if (result) {
            return "success"; // 请不要修改或删除
        } else {
            // 验证失败
            return "fail";
        }
    }

    private boolean enterprisePayCallback(HttpServletRequest request) throws UnsupportedEncodingException {
        // 1:获取支付宝GET过来反馈信息
        Map<String, String> params = new HashMap<String, String>();
        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] + ",";
            }
            params.put(name, new String(valueStr.getBytes("ISO-8859-1"), "UTF-8"));
        }
        //2:计算得出通知验证结果
        // 返回公共参数
        String tradeno = params.get("trade_no");
        //支付返回的请求参数body
        String bodyJson = params.get("body");
        System.out.println(bodyJson);
        try {
            JSONObject bodyJsonObject = JSONObject.parseObject(bodyJson);
            String enterpriseId = bodyJsonObject.getString("enterpriseId");
            String ptype = bodyJsonObject.getString("ptype");
            // 课程支付成功,保存的订单交易明细
            // 支付类型为 预支付 的操作
            if(ptype!=null && ptype.equalsIgnoreCase("prepaid")){
                // 支付完成需要保存的一些信息
                payCommonService.payprepaid(bodyJsonObject,enterpriseId,tradeno);
            }

        } catch (Exception ex) {
            ex.printStackTrace();
            return false;
        }
        return true;
    }

标签:alipay,支付宝,扫码,return,String,支付,model,public
来源: https://blog.csdn.net/m0_49044558/article/details/122235706