支付宝APP支付服务端代码实现
程序员文章站
2024-03-22 22:57:34
...
一、准备工作,例如应用的创建、入驻蚂蚁金服开放平台等等在此不做赘述。
二、下载支付宝SDK包,把alipay-sdk-java-4.9.124.ALL.jar 引入到项目中,或者在pom文件中添加依赖,如下:
<!-- 支付宝支付相关start -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.1.0</version>
</dependency>
<!-- 支付宝支付相关end -->
三、配置文件中配置支付宝相关的参数,如下:
public class AlipayConfig {
// 1.商户appid,使用商户自己的appid即可
//public static String APPID = "2016102300747877";//沙箱应用
public static String APPID = "********";//应用APPID
// 2.私钥 pkcs8格式的,与在支付宝存储的公钥对应
public static String APP_PRIVATE_KEY = "**********";
// 3.支付宝公钥,支付宝生成的公钥,切勿与商户公钥混淆
//public static String ALIPAY_PUBLIC_KEY = "********************";
// 4.服务器异步通知页面路径 需http://或者https://格式的完整路径,必须外网可以正常访问,可以使用natapp进行外网映射
public static String notify_url = "http://ip或者域名:项目端口/项目名称/rest/payment/getAlipayNotify/";
// 5.页面跳转同步通知页面路径 需http://或者https://格式的完整路径,必须外网可以正常访问 商户可以自定义同步跳转地址
public static String return_url = "http://ip或者域名:项目端口/项目名称/rest/payment/getAlipayNotify/";
// 6.请求支付宝的网关地址,此处为沙箱测试地址,正式环境替换即可
public static String URL = "https://openapi.alipaydev.com/gateway.do";
// 7.编码
public static String CHARSET = "UTF-8";
// 8.返回格式
public static String FORMAT = "json";
// 9.加密类型
public static String SIGNTYPE = "RSA2";
}
四、生成安卓端需要的orderString信息的接口方法:
public Result<Object> paymentSave(HttpServletRequest request,String phone,String id,String identification) {
// 这是我的项目中的接口返回值,可根据自己的项目返回值进行处理,此接口中只要正确返回alipay即可
Result<Object> resu = new Result<Object>();
Map map = new HashMap();
try {
String actual_amount = "500";// 充值金额
// 1.生成订单
String bill_num = DataVerification.getRandomNickname2(11);//订单编号
// 2.业务逻辑可自行处理,例如数据中存储此订单
String alipay = PaymentComm.alipay(actual_amount, bill_num);
// alipay 方法,下边代码进行介绍
map.put("alipay", alipay);
resu.setResult(map);
resu.setSuccess(true);
resu.setMessage("操作成功");
resu.setCode(200);
} catch (Exception e) {
resu.setSuccess(false);
resu.setMessage("操作异常");
resu.setCode(403);
}
return resu;
}
五、生成订单的方法中调用该方法alipay:
public class PaymentComm {
public static void main(String[] args) throws AlipayApiException {
String pricePaid = "200";
String orderId = "286621535406962406";
alipay(pricePaid, orderId);
}
// 可以在生成订单的方法中调用该方法即可,由于商户生成订单的业务的不用
public static String alipay(String pricePaid, String orderId) {
// 支付宝网关
String url = AlipayConfig.URL;
// 商户的APPID
String appid = AlipayConfig.APPID;
// 商户的私钥
String appPrivateKey = AlipayConfig.APP_PRIVATE_KEY;
// 参数返回格式
String format = AlipayConfig.FORMAT;
// 字符编码
String charset = AlipayConfig.CHARSET;
// 支付宝公钥
String alipayPublicKey = AlipayConfig.ALIPAY_PUBLIC_KEY;
// 商户生成签名的算法
String signtype = AlipayConfig.SIGNTYPE;
// 实例化客户端
AlipayClient alipayClient = new DefaultAlipayClient(url, appid, appPrivateKey, format, charset, alipayPublicKey,
signtype);
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("用户充值");
model.setSubject("");//商品标题
model.setOutTradeNo(orderId); // 商家订单的唯一编号
model.setTimeoutExpress("30m"); // 超时关闭该订单时间
model.setTotalAmount(pricePaid); // 订单总金额
model.setProductCode("QUICK_MSECURITY_PAY"); // 销售产品码,商家和支付宝签约的产品码,为固定值QUICK_MSECURITY_PAY
request.setBizModel(model);
request.setNotifyUrl(AlipayConfig.notify_url); // 回调地址
String orderString = "";
try {
// 这里和普通的接口调用不同,使用的是sdkExecute
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
// orderString 可以直接给客户端请求,无需再做处理。
orderString = response.getBody();
System.out.println(orderString);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return orderString;
}
}
六、支付成功后服务端接收支付宝发来的异步通知的接口方法
注:此接口必须为外网可以访问,接口测试工具:http://coolaf.com/,操作步骤如下:
如果返回Status Code: 200 OK 则证明你的接口外网可以正常访问
/*
* @author:wangyq
* @function:支付宝充值结果通知接口
* @date 2020年04月22日
*/
@ApiOperation(value = "支付宝结果通知")
@RequestMapping(value = "getAlipayNotify/", produces = "application/json;charset=UTF-8", method = {
RequestMethod.POST })
@ResponseBody
public String getAlipayNotify(HttpServletRequest request) {
// 当前时间
String date = DateUtils.getDate("yyyy-MM-dd HH:mm:ss");
String res = "";
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对应应用下查看。
try {
boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,
AlipayConfig.SIGNTYPE);
if (flag) {
String trade_status = params.get("trade_status");//支付状态
String out_trade_no = params.get("out_trade_no");//订单号
String price = params.get("total_amount");//金额
String trade_no = params.get("trade_no");//支付宝交易号
if ("TRADE_SUCCESS".equals(trade_status)) {
// 交易支付成功的执行相关业务逻辑
res = "success";
} else if ("TRADE_CLOSED".equals(trade_status)) {
// 未付款交易超时关闭,或支付完成后全额退款,执行相关业务逻辑
}
}
} catch (Exception e) {
e.printStackTrace();
}
return res;
}
上一篇: 一个简单漂亮的前端聊天界面
下一篇: iOS---UIWindow的介绍