支付宝支付之电脑网站支付与SpringMvc整合

支付宝开放平台下载alipay-java-sdk

https://open.alipay.com

目前官方没有提供maven,下载sdk后,可以用maven命令安装到本地仓库,执行如下命令

mvn install:install-file -DgroupId=com.alipay -DartifactId=alipay-sdk-java -Dversion=xxx -Dpackaging=jar -Dfile=D:\alipay-sdk-javaxxx.jar

项目增加maven配置

<dependency>
    <groupId>com.alipay</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>xxx</version>
</dependency>

前端付款界面

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
<script src="http://libs.baidu.com/jquery/1.8.3/jquery.min.js"></script>
</head>
<body>
    <%-- <form action="${pageContext.request.contextPath}/AliPay/pay" method="post">
        <!-- 这里是表单内容 -->
        <button type="submit">付 款</button>
    </form> --%>

    <input type="button" id="btnPay" value="付款">
    <div id="resultForm"></div>
</body>
</html>
<script type="text/javascript">
$(function(){
    $(‘#btnPay‘).click(function() {
        $.ajax({
            url : ‘${pageContext.request.contextPath}/AliPay/pay2‘,
            type : "POST",
            data : "",
            contentType : "application/json",
            success : function(data) {
                //后台会返回一个新的交易表单,并自动提交。所以随便放在一个地方就行
                console.log(data);
                $("#resultForm").append(data);
            },
            error : function() {
            }
        });
    });
});
</script>

增加一个AlipayConfig

package com.zns.pay.alipay;

public class AlipayConfig {

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

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

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "";

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

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

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

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

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

后台控制器代码

package com.zns.controller;

import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.zns.pay.alipay.AlipayConfig;

@Controller
@RequestMapping("/AliPay")
public class AliPayController {
    protected final Logger logger = Logger.getLogger(AliPayController.class);

    @RequestMapping("/pay")
    public void pay(HttpServletRequest request,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);

        //商户订单号,商户网站订单系统中唯一订单号,必填
        String out_trade_no =String.valueOf(new Date().getTime());
        //销售产品码,与支付宝签约的产品码名称。 注:目前仅支持FAST_INSTANT_TRADE_PAY
        String product_code="FAST_INSTANT_TRADE_PAY";
        //付款金额,必填
        String total_amount = "0.01";
        //订单名称,必填
        String subject = "订单"+String.valueOf(new Date().getTime());
        //商品描述,可空
        String body = "";

        alipayRequest.setBizContent(""
                + "{"
                + "\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"product_code\":\""+ product_code +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\""
                + "}"
                );
        //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

        //调用SDK生成表单
        String form = alipayClient.pageExecute(alipayRequest).getBody();
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().println(form);
    }

    @RequestMapping(value="/pay2",produces = "application/text;charset=utf-8")
    @ResponseBody
    public String pay2(HttpServletRequest request,HttpServletResponse response) throws Exception {
        //代码和上面一样
        //调用SDK生成表单
        //String form = alipayClient.pageExecute(alipayRequest).getBody();
        String form="";
        return form;
    }

    /**
     * 支付宝服务器同步通知url
     */
    @RequestMapping(value="/returnUrl")
    public String returnUrl(HttpServletRequest request,HttpServletResponse response){
        logger.info("支付宝服务器同步通知url...");
        //处理逻辑省略...
        return "web/pay/success";
    }

    /**
     * 支付宝服务器异步通知url
     * @throws Exception
     */
    @RequestMapping(value="/notifyUrl")
    public void notifyUrl(HttpServletRequest request,HttpServletResponse response) throws Exception{
        logger.info("进入支付宝服务器异步通知url...");
        //获取支付宝POST过来的信息
        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);
        }

        //调用SDK验证签名
        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); 

        //——请在这里编写您的程序(以下代码仅作参考)——

        /* 实际验证过程建议商户务必添加以下校验:
        1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
        2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
        3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
        4、验证app_id是否为该商户本身。
        */
        if(signVerified) {//验证成功
            //商户订单号
            String out_trade_no =request.getParameter("out_trade_no");
            //支付宝交易号
            String trade_no =request.getParameter("trade_no");
            //交易状态
            String trade_status =request.getParameter("trade_status");
            if(trade_status.equals("TRADE_FINISHED")){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //退款日期超过可退款期限后(如三个月可退款),支付宝系统会发送该交易状态通知
            }else if (trade_status.equals("TRADE_SUCCESS")){
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序

                //注意:
                //付款完成后,支付宝系统会发送该交易状态通知
            }
            //记录日志信息
        }else {//验证失败
            //调试用,记录日志信息
            //Logger.error(AlipaySignature.getSignCheckContentV1(params));
        }
    }
}

原文地址:https://www.cnblogs.com/zengnansheng/p/10389766.html

时间: 2024-11-13 04:28:00

支付宝支付之电脑网站支付与SpringMvc整合的相关文章

支付宝支付之手机网站支付

正在更新 今天将支付宝支付的手机网站支付demo拷贝过来,出现了加密错误,报的错误是DerInputStream.getLength(): lengthTag=127, too big.,我猜测可能是私钥没有设置,明天将私钥要来,再试试,我出错大概在第一步 支付宝手机网站支付流程如下,

支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付,当然也是每个公司少不了的第三方支付接入选择. 因此,本篇文章主要分析和总结支付宝支付中的扫码支付.H5支付相关业务流程. 概述 1. 电脑网站支付 电脑网站支付,也称扫码支付,是专门针对电脑而开发的一种支付方式,既在网页展示一个动态生成的支付二维码,用户通过手机支付宝扫码以后可实现支付功能的一种支付方式.

Java调用支付宝支付遇到的坑

下单成功,回调不成功 原因:支付宝公钥填成商户公钥.这两个公钥是不一样的,但开头和结尾很多字符都一样,如果不用文本比对器比对很难发现!而且支付宝公钥填成商户公钥还能下单成功,只是回调不成功,这让原因更加难以排查. 电脑网站支付与APP支付的同名参数,取值不同 原因:APP端,bizModel中的productCode是自己命名的字符串 PC端,bizModel中的productCode 必须设置为FAST_INSTANT_TRADE_PAY 原文地址:https://www.cnblogs.co

H5 网站支付宝支付(前端部分)包含微信浏览器中的处理方法。

手机网站唤起支付宝支付: H5 网站实现支付宝支付是一个很常见的需求: 实现方式主要是在后台配置和预支付, 前端需要做的就是唤起 支付宝App 然后就可以输入密码支付. 这个其实难度很低, 主要就是在后台返回的签名加上支付宝给的 基本访问前缀 拼接 URL 然后通过方法 window.location.href 方法打开拼接后的 URL 即可唤起支付宝支付. 微信浏览器打开网站使用支付宝支付: 这个比较坑爹,微信浏览器会当掉 支付宝的 URL 链接,只能去浏览器中打开就可 1.一般直接通过 wi

ThinkPHP5 支付宝支付扩展库(超简单,超好用~)

我的想法是,只需要调用一个静态方法就可以完成所需要的所有工作,再也不必重复造轮子! ThinkPHP5 支付宝支付扩展库, 包括手机网站支付.电脑网站支付.支付查询.退款.退款查询.对账单等 随着支付宝官方不断更新(目前是2017年7月21日),大家可以在GitHub查看说明说明 https://github.com/dream2023/ThinkPHP5-alipay 用法 电脑网站支付 Pagepay.php 调用 \alipay\Pagepay::pay($params) 即可 手机网站支

Python 支付宝支付

一,支付宝介绍 1. 支付宝开发网址 支付宝开放平台: https://open.alipay.com/platform/home.htm 支付宝沙箱环境: https://openhome.alipay.com/platform/appDaily.htm?tab=info 支付宝开发者文档:https://openhome.alipay.com/developmentDocument.htm 电脑网站支付流程:https://docs.open.alipay.com/270 生成签名:http

第三方支付之支付宝(电脑网站支付)

第一步:蚂蚁金服开放平台注册账号 该步骤的详细流程请参考蚂蚁金服官方说明,本示例主要关注Java后台代码的实现 第二步:下载SDK,安装到本地或远程Maven仓库 1. 进入下载的SDK的如下目录 alipay.trade.page.pay-JAVA-UTF-8\WebContent\WEB-INF\lib 2. 安装alipay-sdk-javaXXX.jar mvn install:install-file -Dfile=D:\alipay.trade.page.pay-JAVA-UTF-8

java实现沙箱测试环境支付宝支付(demo)和整合微信支付和支付宝支付到springmvc+spring+mybatis环境全过程(支付宝和微信支付、附源码)

一.支付宝测试环境代码测试 1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse readme.txt请好好看一下. 只有一个Java配置类,其余都是JSP. 3.配置AlipayConfig (1).注册蚂蚁金服开发者账号(免费,不像苹果会收取费用) 注册地址:https://open.alipay.com ,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(我选的是自研). (2).设

支付宝:电脑网站沙箱测试(Java)

1.下载电脑网站的官方demo: 下载地址:https://docs.open.alipay.com/270/106291/ 2.下载解压导入eclipse readme.txt请好好看一下. 只有一个Java配置类,其余都是JSP. 3.配置AlipayConfig (1).注册蚂蚁金服开发者账号(免费,不像苹果会收取费用) 注册地址:https://open.alipay.com ,用你的支付宝账号扫码登录,完善个人信息,选择服务类型(我选的是自研). (2).设置app_id和gatewa