支付宝支付、退款(网站应用)

时间:2025-02-15 20:23:51

1.1  第一步:创建应用

1.      您需要先去蚂蚁金服开放平台(),在开发者中心创建登记您的应用,此时您将获得应用唯一标识(APPID);

2.      请在【功能信息】中点击【添加功能】,选择【电脑网站支付】;

3.      提交审核,等待审核通过,该应用正式可以使用。

1.2  第二步:配置密钥

开发者调用接口前需要先生成RSA密钥,RSA密钥包含应用私钥(APP_PRIVATE_KEY)、应用公钥(APP_PUBLIC_KEY)。生成密钥后在开放平台管理中心进行密钥配置,配置完成后可以获取支付宝公钥(ALIPAY_PUBLIC_KEY)

1.3 搭建和配置开发环境

1.      下载服务端SDK以及相关支付代码

/270/106291/

2.       接口调用配置

1.4  接口调用

 支付接口(


 退款接口(


代码如下:

AlipayConfig 类

package ;


import ;
import ;


/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 */


public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

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

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

// 支付宝公钥,查看地址:/platform/ 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "";


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



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


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

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

// 支付宝网关
public static String gatewayUrl = "/";

// 支付宝网关
public static String log_path = "C:\\";



//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


    /** 
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + ()+".txt");
            (sWord);
        } catch (Exception e) {
            ();
        } finally {
            if (writer != null) {
                try {
                    ();
                } catch (IOException e) {
                    ();
                }
            }
        }
    }
}



Alipay类


package ;
import ;
import ;
import ;
import ;
import ;


import ;
import ;
import ;


import ;
import ;
import ;
import ;


import ;
import ;
import ;
import ;
import ;
import ;
import ;
import ;


@Controller
public class Alipay {

/**
* 执行支付
* @throws IOException 
* @throws AlipayApiException 
* out_trade_no 商户订单号,商户网站订单系统中唯一订单号,必填
* total_amount 付款金额,必填
* subject 订单名称,必填
* body 商品描述,可空

*/
@RequestMapping("pay")
public String pay(
@RequestParam("WIDout_trade_no") String out_trade_no,
@RequestParam("WIDsubject") String subject,
@RequestParam("WIDtotal_amount") String total_amount,
@RequestParam("WIDbody") String body,
Model mode,
HttpServletRequest request,
HttpSession session,
HttpServletResponse response) throws IOException, AlipayApiException {

//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", , AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

//设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
(AlipayConfig.return_url);
(AlipayConfig.notify_url);


//进行转换码
subject = new String(("ISO-8859-1"), "utf-8");
body = new String(("ISO-8859-1"), "utf-8");

("{\"out_trade_no\":\""+ out_trade_no +"\"," 
+ "\"total_amount\":\""+ total_amount +"\"," 
+ "\"subject\":\""+ subject +"\"," 
+ "\"body\":\""+ body +"\"," 
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

//若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
//("{\"out_trade_no\":\""+ out_trade_no +"\"," 
// + "\"total_amount\":\""+ total_amount +"\"," 
// + "\"subject\":\""+ subject +"\"," 
// + "\"body\":\""+ body +"\"," 
// + "\"timeout_express\":\"10m\"," 
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
//请求参数可查阅【电脑网站支付的API文档--请求参数】章节

//请求
String result = (alipayRequest).getBody();


("result", result);

return "truePay";

}


/**当用户确认支付的时候同步返回参数信息
* 支付宝服务器同步通知
* @throws AlipayApiException 
* @throws IOException 
*/
@RequestMapping("returnCallBack")
public String  returnCallBack(
HttpServletRequest request,
HttpSession session,
HttpServletResponse response,
Model model) throws AlipayApiException, IOException {

String str = null;

String result = null;
//获取支付宝GET过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map<String,String[]> requestParams = ();
for (Iterator<String> iter = ().iterator(); ();) {
String name = (String) ();
String[] values = (String[]) (name);
String valueStr = "";
for (int i = 0; i < ; i++) {
valueStr = (i == - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用
valueStr = new String(("ISO-8859-1"), "utf-8");
(name, valueStr);
}

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


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

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

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

result =  "trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount;
result=new String(("ISO-8859-1"),"utf-8");

str = "product";

}else {
str = "err";
().println("验签失败");
}

("result", result);

return str;

}

/**
* 支付宝服务器异步通知
* @param request
* @param session
* @param response
* @throws AlipayApiException
* @throws IOException
*/
@RequestMapping("notifyCallBack")
public void notifyCallBack(
HttpServletRequest request,
HttpSession session,
HttpServletResponse response) throws AlipayApiException, IOException {

//获取支付宝POST过来反馈信息
Map<String,String> params = new HashMap<String,String>();
Map<String,String[]> requestParams = ();
for (Iterator<String> iter = ().iterator(); ();) {
String name = (String) ();
String[] values = (String[]) (name);
String valueStr = "";
for (int i = 0; i < ; i++) {
valueStr = (i == - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用
valueStr = new String(("ISO-8859-1"), "utf-8");
(name, valueStr);
}

//调用SDK验证签名
boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, , 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 = new String(("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");

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

//交易状态
String trade_status = new String(("trade_status").getBytes("ISO-8859-1"),"UTF-8");

//交易状态枚举值
//WAIT_BUYER_PAY 交易创建,等待买家付款
//TRADE_CLOSED 未付款交易超时关闭,或支付完成后全额退款
//TRADE_SUCCESS 交易支付成功
//TRADE_FINISHED 交易结束,不可退款

if(trade_status.equals("TRADE_FINISHED")){
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序

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

//注意:
//付款完成后,支付宝系统发送该交易状态通知,到此地方执行相关业务处理
}

().println("success");

}else {//验证失败
().println("fail");
}
}


/**
* 退款
* @return
* @throws AlipayApiException 
* @throws UnsupportedEncodingException 
* out_trade_no,//商户订单号,商户网站订单系统中唯一订单号
* trade_no,//支付宝交易号
* refund_amount,//需要退款的金额,该金额不能大于订单金额,必填
* refund_reason,//退款的原因说明
* out_request_no,//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
*/
@RequestMapping("refund")
public String refund(
@RequestParam(value="WIDTRout_trade_no",required=false) String out_trade_no,//商户订单号,商户网站订单系统中唯一订单号
@RequestParam(value="WIDTRtrade_no",required=false) String trade_no,//支付宝交易号
@RequestParam("WIDTRrefund_amount") String refund_amount,//需要退款的金额,该金额不能大于订单金额,必填
@RequestParam("WIDTRrefund_reason") String refund_reason,//退款的原因说明
@RequestParam("WIDTRout_request_no") String out_request_no,//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
HttpServletRequest request,
HttpSession session,
Model mode,
HttpServletResponse response) throws AlipayApiException, UnsupportedEncodingException {

//获得初始化的AlipayClient
AlipayClient alipayClient = new DefaultAlipayClient(, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", , AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

//设置请求参数
AlipayTradeRefundRequest alipayRequest = new AlipayTradeRefundRequest();

("{\"out_trade_no\":\""+ out_trade_no +"\"," 
+ "\"trade_no\":\""+ trade_no +"\"," 
+ "\"refund_amount\":\""+ refund_amount +"\"," 
+ "\"refund_reason\":\""+ new String(refund_reason.getBytes("ISO-8859-1"),"UTF-8") +"\"," 
+ "\"out_request_no\":\""+ new String(out_request_no.getBytes("ISO-8859-1"),"UTF-8") +"\"}");

//请求并获取返回过来的消息
String result = (alipayRequest).getBody();

//把从请求过来的消息,转换为json数据
JSONObject resultJsonAll  = (result);

JSONObject results = (("alipay_trade_refund_response"));

//获取退款消息
String mess = ("msg");
//获取商户订单号
String re_out_trade_no = ("out_trade_no");
//获取交易号
String re_trade_no = ("trade_no");
//获取退款金额
String refund_fee = ("refund_fee");
//获取退至账户
String buyer_logon_id = ("buyer_logon_id");

("mess", mess);
("refund_fee", refund_fee);
("buyer_logon_id", buyer_logon_id);
//如果返回过来的消息等于Success 则调用退款接口成功
if("Success".equals(mess)) {
return "refund";
}else {
return "err";
}
}


}
此致,jsp页面就不贴啦~~请原谅..