spring mvc集成支付宝沙盒测试

调用支付宝第三方支付接口(沙盒环境)spring mvc+pom.xml

环境配置:

沙盒环境入口:

网址:https://open.alipay.com/platform/developerIndex.htm

使用支付宝账号扫码登录,进入沙盒环境配置相关参数

配置沙盒环境参数:

RSA2秘钥官方配置文档:https://docs.open.alipay.com/291/105971

下载 支付宝沙箱app,用于沙箱扫码支付使用

下载支付宝沙盒demo地址

下载地址:http://p.tb.cn/rmsportal_6680_alipay.trade.page.pay-JAVA-UTF-8.zip

官方demo截图:

集成spring mvc

项目结构

支付接口调用时序图

AlipayConfig配置文件

// 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
public static String app_id = "2016101800716335";

// 商户私钥,您的PKCS8格式RSA2私钥
public static String merchant_private_key = "自己的商户私钥";

// 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
public static String alipay_public_key = "自己的支付宝公钥,如果签名方式是RSA2则选择RSA2对应 的支付宝公钥";

// 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String notify_url = "http://vyq8dp.natappfree.cc/aliPay_demo/syncNotice";

// 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
public static String return_url = "http://vyq8dp.natappfree.cc/aliPay_demo/returnUrl";

// 签名方式
public static String sign_type = "RSA2";

// 字符编码格式
public static String charset = "utf-8";

// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

 支付Controller

 @PostMapping(value = "aliPayQuickPay", produces = "text/plain;charset=utf-8")
    public void aliPayQuickPay(QuickPayModel model, HttpServletResponse response) throws Exception {
        //获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
        alipayRequest.setBizContent("{\"out_trade_no\":\""+ model.getOrderNo() +"\","
                + "\"total_amount\":\""+ model.getOrderAmt() +"\","
                + "\"subject\":\""+ model.getOrderSubject() +"\","
                + "\"body\":\""+ model.getBusinessDesc() +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        //记录日志
        AlipayConfig.logResult(result);
        System.out.println(result);
        response.setContentType("text/html;charset=" + "UTF-8");
        response.getWriter().write(result);// 直接将完整的表单html输出到页面
        response.getWriter().flush();
        response.getWriter().close();
    }

支付结果回调Controller

@RequestMapping("returnUrl")
    public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws Exception {
        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        for (Iterator<String> 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);
        }
        System.out.println(params.toString());
        boolean signVerified = AlipaySignature.rsaCheckV2(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

        PrintWriter out = response.getWriter();
        //——请在这里编写您的程序(以下代码仅作参考)——
        if(signVerified) {
            //商户订单号
            String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //支付宝交易号
            String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

            //付款金额
            String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8");

            out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);
        }else {
            out.println("signVerified fail");
        }
    }

支付结果同步返回结果在本地就可以;

异步支付返回结果必须使用外网(可以使用内网穿透)

内网穿透可以参考https://blog.csdn.net/ejinxian/article/details/76061059

支付结果验签失败踩过的坑:

支付jsp页面

<form name=alipayment action="${root}/aliPayQuickPay" method=post
          target="_blank">
        <div id="body1" class="show" name="divcontent">
            <dl class="content">
                <dt>商户订单号 :</dt>
                <dd>
                    <input id="orderNo" name="orderNo" />
                </dd>
                <hr class="one_line">
                <dt>订单名称 :</dt>
                <dd>
                    <input id="orderSubject" name="orderSubject" />
                </dd>
                <hr class="one_line">
                <dt>付款金额 :</dt>
                <dd>
                    <input id="orderAmt" name="orderAmt" />
                </dd>
                <hr class="one_line">
                <dt>商品描述:</dt>
                <dd>
                    <input id="businessDesc " name="businessDesc " />
                </dd>
                <hr class="one_line">
                <dt></dt>
                <dd id="btn-dd">
						<span class="new-btn-login-sp">
							<button class="new-btn-login" type="submit"
                                    style="text-align: center;">付 款</button>
						</span> <span class="note-help">如果您点击“付款”按钮,即表示您同意该次的执行操作。</span>
                </dd>
            </dl>
        </div>
    </form>

最后附上demo地址https://github.com/Break0504/demo/tree/master/aliPay-demo

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值