1.项目中导入 alipay.sdk
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.0.0</version>
</dependency>
2.初始化客户端配置私钥,公钥等.
public class AlipayUtil {
public static final String ALIPAY_APPID = ConfigUtil.getProperty("alipay.appid"); // appid
public static String APP_PRIVATE_KEY = null; // app支付私钥
public static String ALIPAY_PUBLIC_KEY = null; // 支付宝公钥
static {
try {
APP_PRIVATE_KEY = ConfigUtil.getProperty("alipay.appivatekey");
ALIPAY_PUBLIC_KEY =ConfigUtil.getProperty("alipay.publickey");
} catch (Exception e) {
e.printStackTrace();
}
}
// 统一收单交易创建接口
private static AlipayClient alipayClient = null;
public static AlipayClient getAlipayClient() {
if (alipayClient == null) {
synchronized (AlipayUtil.class) {
if (null == alipayClient) {
alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", ALIPAY_APPID,
APP_PRIVATE_KEY,"json", "utf-8",
ALIPAY_PUBLIC_KEY,"RSA2");
}
}
}
return alipayClient;
}
3.service业务层调用:
/**
* 支付宝下单
*/
@Override
public Map<String,Object> orderPay(Map<String, String> map, String notifyUrl) {
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(map.get("Body"));
model.setSubject(map.get("Subject"));
model.setOutTradeNo(map.get("OutTradeNo"));//
model.setTimeoutExpress(map.get("TimeoutExpress"));
model.setTotalAmount(map.get("Amount"));//
model.setProductCode(map.get("ProductCode"));
request.setBizModel(model);
request.setNotifyUrl(notifyUrl);
AlipayTradeAppPayResponse response = null;
Map<String,Object> returnMap=new HashMap<String,Object>();
try {
response = AlipayUtil.getAlipayClient().sdkExecute(request);
logger.info(response.isSuccess()+"-------");
if(response.isSuccess()) {
returnMap.put("responseState","success");
System.out.println(response.getBody());
returnMap.put("aliPayResult",response.getBody());
}
} catch (AlipayApiException e) {
public Map<String,String> getSign(String restXml) throws Exception {
Map<String,String>params=WXPayUtil.xmlToMap(restXml);
LOG.info("微信异步通知参数");
if(wxpay.isPayResultNotifySignatureValid(params)) {//验签成功
params.put("resultState","success");
}else {
params.put("resultState","fail");
}
return params;
}
e.printStackTrace();} return returnMap;}4.验签:
@Override
public boolean getSign(Map<String, String> params) {
logger.info(AlipayUtil.ALIPAY_PUBLIC_KEY + "--" + AlipayConstants.CHARSET_UTF8);
try {
return AlipaySignature.rsaCheckV1(params, AlipayUtil.ALIPAY_PUBLIC_KEY,"utf-8","RSA2");
} catch (AlipayApiException e) {
e.printStackTrace();
}
return false;
}
5.退款
@Override
public Map<String, Object> orderPayRefund(Map<String, String> map) {
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest(); // 统一收单交易退款接口
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
model.setOutTradeNo(map.get("OutTradeNo"));
//model.setTradeNo(map.get("TradeNo"));
model.setRefundAmount(map.get("RefundAmount"));
model.setRefundReason(map.get("RefundReason"));
model.setOutRequestNo(map.get("OutRequestNo"));
request.setBizModel(model);
Map<String, Object> restmap = new HashMap<>();// 返回支付宝退款信息
AlipayTradeRefundResponse alipayResponse;
try {
alipayResponse = AlipayUtil.getAlipayClient().execute(request);
if (alipayResponse.isSuccess()) {
logger.info("退款成功");
restmap.put("out_trade_no", alipayResponse.getOutTradeNo());
restmap.put("trade_no", alipayResponse.getTradeNo());
restmap.put("buyer_logon_id", alipayResponse.getBuyerLogonId());// 用户的登录id
restmap.put("gmt_refund_pay", alipayResponse.getGmtRefundPay()); // 退款支付时间
restmap.put("buyer_user_id", alipayResponse.getBuyerUserId());// 买家在支付宝的用户id
restmap.put("refundType", "success");
} else {
logger.info("退款失败");
restmap.put("refundType", "fail");
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return restmap;
}
微信支付:
1,引入:引入jar包
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
2.下单:
/**
* 扫码支付 下单
*/
public void doUnifiedOrder() {
HashMap<String, String> data = new HashMap<String, String>();
data.put("body", "腾讯充值中心-QQ会员充值");
data.put("out_trade_no", out_trade_no);
data.put("device_info", "");
data.put("fee_type", "CNY");
data.put("total_fee", "1");
data.put("spbill_create_ip", "127.0.0.1");
data.put("notify_url", "http://test.letiantian.me/wxpay/notify");
data.put("trade_type", "APP");
data.put("product_id", "12");
// data.put("time_expire", "20170112104120");
try {
Map<String, String> r = wxpay.unifiedOrder(data);
System.out.println(r);
} catch (Exception e) {
e.printStackTrace();
}
}
2.下单获取到预支付订单后,进行二次签名给app端。
/**
*
* @Title: secondSign
* @Description: 微信二次签名
* @param @param map
* @param @return
* @param @throws Exception 参数
* @return String 返回类型
* @throws
*/
public String secondSign(Map<String,String> map) throws Exception {
LOG.info("第二次验签参数--"+map);
String sign=WXPayUtil.generateSignature(map, config.getKey(), SignType.HMACSHA256);
return sign;
}
3.验签
public Map<String,String> getSign(String restXml) throws Exception {
Map<String,String>params=WXPayUtil.xmlToMap(restXml);
LOG.info("微信异步通知参数");
if(wxpay.isPayResultNotifySignatureValid(params)) {//验签成功
params.put("resultState","success");
}else {
params.put("resultState","fail");
}
return params;
}
4.退款
/**
* 作用:申请退款<br>
* 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
* 其他:需要证书
* @param reqData 向wxpay post的请求数据
* @param connectTimeoutMs 连接超时时间,单位是毫秒
* @param readTimeoutMs 读超时时间,单位是毫秒
* @return API返回数据
* @throws Exception
*/
public Map<String, String> refund(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
String url;
if (this.useSandbox) {
url = WXPayConstants.SANDBOX_REFUND_URL_SUFFIX;
}
else {
url = WXPayConstants.REFUND_URL_SUFFIX;
}
String respXml = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
return this.processResponseXml(respXml);
}