支付宝APP支付
package cn.xizhi.until.pay;
import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @author lulu
* @version 1.0.0
* @ClassName ALiPay.java
* @Description TODO
* @createTime 2021年05月18日 15:39:00
*/
public class ALiPay {
/*支付网关*/
private static final String URL = "https://openapi.alipay.com/gateway.do";
/*应用id*/
private static final String APP_ID = "填写自己的";
/*应用私钥*/
private static final String APP_PRIVATE_KEY = "填写自己的";
/*支付宝公钥*/
private static final String ALIPAY_PUBLIC_KEY = "填写自己的";
/*类型*/
private static final String CHARSET = "UTF-8";
public static AlipayTradeAppPayResponse pay(BigDecimal price, String description, String out_trade_no) {
/** 支付宝网关 **/
String URL = "https://openapi.alipay.com/gateway.do";
/** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/
String APP_ID = "填写自己的";
/** 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/
String APP_PRIVATE_KEY = "填写自己的";
/** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/
String ALIPAY_PUBLIC_KEY = "填写自己的";
/** 初始化 **/
AlipayClient alipayClient = new DefaultAlipayClient(URL, APP_ID, APP_PRIVATE_KEY, "json", "UTF-8", ALIPAY_PUBLIC_KEY, "RSA2");
/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称: alipay.trade.app.pay(app 支付接口) **/
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
/** 设置业务参数 **/
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
/** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/
model.setOutTradeNo(out_trade_no);
/** 订单标题 **/
model.setSubject(description);
/** 销售产品码,固定值:QUICK_MSECURITY_PAY **/
model.setProductCode("QUICK_MSECURITY_PAY");
/** 订单金额,精确到小数点后两位 **/
model.setTotalAmount(String.valueOf(price));
/** 订单描述 **/
model.setBody(description);
/** 业务扩展参数 **/
//ExtendParams extendParams = new ExtendParams();
/** 花呗分期参数传值前提:必须有该接口花呗收款准入条件,且需签约花呗分期 **/
/** 指定可选期数,只支持3/6/12期,还款期数越长手续费越高 **/
// extendParams.setHbFqNum("3");
/** 指定花呗分期手续费承担方式,手续费可以由用户全承担(该值为0),也可以商户全承担(该值为100),但不可以共同承担,即不可取0和100外的其他值。 **/
//extendParams.setHbFqSellerPercent("0");
//model.setExtendParams(extendParams);
/** 将业务参数传至request中 **/
request.setBizModel(model);
/** 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/
request.setNotifyUrl("");
/**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **/
//request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");
AlipayTradeAppPayResponse response = null;
try {
/** 通过alipayClient调用API,获得对应的response类 **/
response = alipayClient.sdkExecute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
/** response.getBody()打印结果就是orderString,可以直接给客户端请求,无需再做处理。 如果传值客户端失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/89 **/
System.out.println(response.getBody());
return response;
}
public static boolean main(HttpServletRequest request) throws AlipayApiException {
//获取支付宝POST过来反馈信息
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean flag = AlipaySignature.rsaCheckV1(params, "填写自己的", "UTF-8", "RSA2");
return flag;
}
/**
* 验证是否完成支付
* @param orderNumber
* @return
*/
public static String selectOrder(String orderNumber){
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); //创建API对应的request类
request.setBizContent("{" +
" \"out_trade_no\":\"" + orderNumber + "\"" +
" }"); //设置业务参数
AlipayTradeQueryResponse response = null; //通过alipayClient调用API,获得对应的response类
try {
response = alipayClient.execute(request);
} catch (AlipayApiException e) {
e.printStackTrace();
}
boolean contains = response.getBody().contains("10000");
if (contains){
return "1";
}else {
return "2";
}
}
public static void main(String[] args) throws AlipayApiException {
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest(); //创建API对应的request类
request.setBizContent("{" +
" \"out_trade_no\":\"" + "210902123199792" + "\"" +
" }"); //设置业务参数
AlipayTradeQueryResponse response = alipayClient.execute(request); //通过alipayClient调用API,获得对应的response类
Object alipay_trade_query_response = JSON.parseObject(response.getBody()).get("alipay_trade_query_response");
boolean contains = response.getBody().contains("10000");
if (contains){
System.out.println(1);
}else {
System.out.println(2);
}
//根据response中的结果继续业务逻辑处理
}
}
亲测可用,复制粘贴即可