JAVA支付宝支付最全教程02 支付宝系统接入 (NATIVE扫码支付)

时间:2024-02-24 10:03:55

本文章由Covenant. XJT编写,在未允许的情况下请勿转载

 

 

 

前一节介绍了如何获取APPID等参数,下面开始系统接入的代码准备

配置文件AlipayConfig.java(配置基本参数)

 

public class AlipayConfig {

  // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号 
  public static String app_id = "填写沙箱环境appid";

  // 商户私钥,您的PKCS8格式RSA2私钥 在设置密钥时生成的应用私钥2048中 
  public static String merchant_private_key = "填写自己设置的密钥返回的应用私钥";

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

  //支付成功后的异步通知url
  public static String notify_url = "填写服务器相关路径";

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

  //支付成功后的跳转url
  public static String return_url = "填写服务器相关路径";

  // 签名方式 不必修改
  public static String sign_type = "RSA2";

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

  // 支付宝网关 正式环境:https://openapi.alipay.com/gateway.do 下面填写的是沙箱环境的网关,接入正式环境时记得修改

  public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

下面是回调类Return,具体业务可在此编写(此处为SpringBoot框架编写方式)

public String Return(HttpServletRequest request){    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] + ",";
}
//乱码解决,这段代码在出现乱码时使用
try {
valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
params.put(name, valueStr);
}
boolean signVerified = false; //调用SDK验证签名
try {
signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfigPc.alipay_public_key, AlipayConfigPc.charset, AlipayConfigPc.sign_type);
} catch (AlipayApiException e) {
e.printStackTrace();
}

//验证签名
if(signVerified) {
//此处编写具体需要实现的业务逻辑
}
}

下面是统一下单接口类pay,此处可以修改为业务需要的订单信息

 

public String pay() {

//获得初始化的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 = "此处填写自定义的订单号,可用UUID.randomUUID()方法";
//付款金额,必填
String total_amount = "此处填写付款金额,金额不得小于0.01";
//订单名称,必填
String subject = “此处自定义”;
//商品描述,可空
String body =“此处自定义” ;

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

//若想给BizContent增加其他可选请求参数,可以在支付宝开放中心相关的文档中查看请求参数项
//alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
// + "\"total_amount\":\""+ total_amount +"\","
// + "\"subject\":\""+ subject +"\","
// + "\"body\":\""+ body +"\","
// + "\"timeout_express\":\"10m\","
// + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

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

//请注意,此处返回后会自动跳转到支付宝的支付页面
return result

}

下面编写支付宝的退款接口alipayRefund,具体情况视实际生产情况修改代码
    public void alipayrefund(){

//商户订单号和支付宝交易号不能同时为空。 trade_no、 out_trade_no如果同时存在优先取trade_no
//商户订单号,和支付宝交易号二选一
String out_trade_no = "此处推荐从数据库获取订单号";
//支付宝交易号,和商户订单号二选一
String trade_no ="此处推荐从数据库获取订单号";
        //退款金额,不能大于订单总金额
String refund_amount = "自定义";
//退款的原因说明
String refund_reason = "自定义";
//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
String out_request_no = "退款单号,自定义,推荐保存到数据库中";
/**********************/
// SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
AlipayTradeRefundRequest alipay_request = new AlipayTradeRefundRequest();

AlipayTradeRefundModel model=new AlipayTradeRefundModel();
model.setOutTradeNo(out_trade_no);
model.setTradeNo(trade_no);
model.setRefundAmount(refund_amount);
model.setRefundReason(refund_reason);
model.setOutRequestNo(out_request_no);
alipay_request.setBizModel(model);

AlipayTradeRefundResponse alipay_response = null;
try {
alipay_response = client.execute(alipay_request);
} catch (AlipayApiException e) {
e.printStackTrace();
}

if(alipay_response.getCode().equals("10000")){
//退款成功后的业务逻辑
}
    //退款失败的业务逻辑


}}



这一节介绍了部分支付宝的接口和配置文件的接入和编写,下节介绍支付宝的查询接口,退款查询接口等