昨天做了 支付宝的支付和提现功能,讲真,简单的我都有点不想总结了。但是为了以后做起来方便还是决定现在费时间点,我写给未来的自己。
必要参数
这个是支付宝方商家要配置的参数
public static final String ALIPAY_PUBLIC_KEY = "公钥";
public static final String APPID="appid";
// 司机版
public static final String APP_PRIVATE_KEY ="秘钥";
public static final String FORMAT = "json";
public static final String SX_SERVER_URL = "https://openapi.alipaydev.com/gateway.do";
public static final String SERVER_URL = "https://openapi.alipay.com/gateway.do";
public static final String CHARSET = "utf-8";
public static final String ALIPAY_NOTIFY_URL="支付宝回复的接口地址(必须对外的)";
public static final String SIGN_TYPE="RSA2";
然后就可以使用了.
APP支付
这里的AlipayConfig是我常量定义的类,照抄的话改成你们自己的配置类
public String aliPay(String no,String money,String remark) {
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.SERVER_URL, AlipayConfig.APPID,
AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, "RSA2");
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(remark);
model.setSubject("支付");
model.setOutTradeNo(no);
model.setTimeoutExpress("30m");
if(money!=null) {
model.setTotalAmount(money);
}else {
model.setTotalAmount("0.01");
}
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.ALIPAY_NOTIFY_URL);
try {
//这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
return response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
return null;
}
这里三个参数no是交易单号,money是钱数,remark是备注。备注可有可无。
提现(就是平台对外转账)
public String driverCash(String no, String amount, String aliAccount, String remark) {
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.SERVER_URL, AlipayConfig.APPID,
AlipayConfig.APP_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, "RSA2");
AlipayFundTransToaccountTransferRequest aliRequest = new AlipayFundTransToaccountTransferRequest();
aliRequest.setBizContent("{" + "\"out_biz_no\":\"" + no + "\"," + "\"payee_type\":\"ALIPAY_LOGONID\","
+ "\"payee_account\":\"" + aliAccount + "\"," + "\"amount\":\"" + amount + "\"," + "\"remark\":\""
+ remark + "\"" + "}");
try {
AlipayFundTransToaccountTransferResponse aliResponse = alipayClient.execute(aliRequest);
if (aliResponse.isSuccess()) {
return "提现成功";
} else {
String msgCode = aliResponse.getSubCode();
if (msgCode.equals("SYSTEM_ERROR")) {
return "系统错误";
} else if (msgCode.equalsIgnoreCase("PAYEE_NOT_EXIST")) {
return "收款账户不存在";
} else if (msgCode.equalsIgnoreCase("PAYER_BALANCE_NOT_ENOUGH")) {
return "付款方余额不足";
} else {
return "提现失败" + aliResponse.getBody();
}
}
} catch (AlipayApiException e) {
e.printStackTrace();
return "方法运行错误";
}
}
上面三个参数:no是订单号,aliAccount是支付宝账号,amount是钱数,remark是备注。
这其实错误的可能其实很多,但是我这里只写了几种经典的。还有一种isv错误,这个是权限问题,因为现在设置支付宝商家账户开通90天才可以使用这个转账功能(我就遇到了这个问题,现在目前是手动转账的。)。
这个90天也不知道以后会不会改,反正感觉支付宝的接口报错做的挺好的,遇到新的自己去看看为什么错就行了。
web端支付
这个和官网有点不一样,因为官网适合前后端一起的项目,直接返回个页面,但是我们这个是前后端分离的,所以我直接把form的页面代码发给了前端,剩下爱咋咋地吧。
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.SERVER_URL, AlipayConfig.CARR_ID,
AlipayConfig.CARR_PRIVATE_KEY, "json", AlipayConfig.CHARSET, AlipayConfig.CARR_PUBLIC_KEY, "RSA2");
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(AlipayConfig.ALIPAY_NOTIFY_URL);
alipayRequest.setNotifyUrl(AlipayConfig.ALIPAY_NOTIFY_URL);// 在公共参数中设置回跳和通知地址
alipayRequest.setBizContent("{" + " \"out_trade_no\":\"20150320010101001\","
+ " \"product_code\":\"FAST_INSTANT_TRADE_PAY\"," + " \"total_amount\":"+money+","
+ " \"subject\":\"Iphone6 16G\"," + " \"body\":\"Iphone6 16G\","
+ " \"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\","
+ " \"extend_params\":{" + " \"sys_service_provider_id\":\"2088511833207846\"" + " }" + " }");// 填充业务参数
try {
String form = alipayClient.pageExecute(alipayRequest).getBody(); // 调用SDK生成表单
return R.ok().put("data", form);
} catch (AlipayApiException e) {
e.printStackTrace();
return R.error();
}
反正目前这三个方法都实测可用了,然后就这样吧。以后项目中再遇到了会继续续写的。
网友评论