刚刚接触app支付宝支付的时候还是走了很多弯路的,希望看到的小伙伴们别要走那么多弯路。
最好以支付宝(蚂蚁金服)提供的文档和API去开发,网上别人写的一些加签方式,可能并不好用。
下面这个地址为App支付请求参数说明:
https://docs.open.alipay.com/204/105465/
还有支付宝的SDK下载地址:
https://docs.open.alipay.com/54/103419
把压缩包解压,之后就是这样:
打开readme.txt
把这两个jar包导入你们自己的项目里面,就可以直接用支付宝的加签方式了,根本就不需要你们自己写的,我就是这个走了不少弯路。
下面就上代码了:
public class AlipayConfig {
// 合作身份者ID,以2088开头由16位纯数字组成的字符串
public static String partner = "2088*********4";
// 6.请求网关地址
public static String URL = "https://openapi.alipay.com/gateway.do";
public static String service = "mobile.securitypay.pay";//固定值
public static String seller_id = "*******@163.com";
//私钥
public static String private_key = "";
// 商户的公钥钥
public static String public_key ="";
// 支付宝的公钥,无需修改该值(不要删除也不要修改,在接收通知的时候需要进行签名认证)
public static String ali_public_key= "";
// 字符编码格式 目前支持 gbk 或 utf-8
public static String input_charset = "utf-8";
// 签名方式 不需修改
public static String sign_type = "RSA";
//APPID
public static String APPID = "****************";
//支付宝回调地址
public static String notify_url = "";
// 8.返回格式
public static String FORMAT = "json"
关于支付宝的回调地址提供给你们一个可以穿透内网的工具:
https://natapp.cn/
通过这个网址获得一个地址,来穿透内网,测试一个支付宝支付还是可以的,具体的操作可以自行百度一下,还是比较简单的。
String orderStr="";
try {
Map orderMap = new LinkedHashMap(); // 订单实体
Map bizModel = new LinkedHashMap(); // 公共实体
/****** 2.商品参数封装开始 *****/ // 手机端用
// 商户订单号,商户网站订单系统中唯一订单号,必填
orderMap.put("out_trade_no", orderPayRequest.getOrderId());
// 订单名称,必填
orderMap.put("subject", "***支付");
// 付款金额,必填
orderMap.put("total_amount", String.valueOf(orderPayRequest.getActualPayMoney()));
// 销售产品码 必填
orderMap.put("product_code", "QUICK_WAP_PAY");
/****** --------------- 3.公共参数封装 开始 ------------------------ *****/ // 支付宝用
// 1.商户appid
bizModel.put("app_id", AlipayConfig.APPID);
// 2.请求网关地址
bizModel.put("method", AlipayConfig.URL);
// 3.请求格式
bizModel.put("format", AlipayConfig.FORMAT);
// 4.回调地址
bizModel.put("return_url", AlipayConfig.notify_url);
// 5.私钥
bizModel.put("private_key", AlipayConfig.private_key);
// 6.商家id
bizModel.put("seller_id", AlipayConfig.partner);
// 7.加密格式
bizModel.put("sign_type", AlipayConfig.sign_type + "");
/****** --------------- 3.公共参数封装 结束 ------------------------ *****/
// 实例化客户端
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
AlipayConfig.private_key, AlipayConfig.FORMAT, AlipayConfig.input_charset,
AlipayConfig.ali_public_key, AlipayConfig.sign_type);
// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest ali_request = new AlipayTradeAppPayRequest();
// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
// model.setPassbackParams(URLEncoder.encode((String)orderMap.get("body").toString()));;
// //描述信息 添加附加数据
// model.setBody(orderMap.get("body")); //商品信息
model.setSubject(orderMap.get("subject")); // 商品名称
model.setOutTradeNo(orderMap.get("out_trade_no")); // 商户订单号(自动生成)
model.setTotalAmount(orderMap.get("total_amount")); // 支付金额
model.setProductCode(orderMap.get("product_code")); // 销售产品码
model.setSellerId(AlipayConfig.partner); // 商家id
ali_request.setBizModel(model);
ali_request.setNotifyUrl(AlipayConfig.notify_url); // 回调地址
AlipayTradeAppPayResponse responses = client.sdkExecute(ali_request);
orderStr = responses.getBody();
System.err.println(orderStr); // 就是orderString 可以直接给客户端请求,无需再做处理
} catch (Exception e) {
e.printStackTrace();
}
return orderStr;
把得到的加了签的字符串给前端就好了,让他们直接去调用支付宝去支付,
还有一个支付宝回调的方法,这个方法并不需要前端访问,而是支付宝回调的:
这个方法的路径,就是支付宝的回调地址,当然了,你得让支付宝能访问你这个方法,内网测试就得用到刚刚用工具得到的地址来测试了:把这个加到刚刚得到的地址后面就好了:比如
http://3gtdkc.natappfree.cc/“项目名字”/order-pay-notify-controller
@RequestMapping(value = "/order-pay-notify-controller", method = {RequestMethod.POST,RequestMethod.GET })
public void notify(@RequestBody String body, HttpServletRequest requests, HttpServletResponse httpServletResponse)
throws IOException {
// 1.从支付宝回调的request域中取值
Map requestParams = requests.getParameterMap();
System.out.println("从支付宝回调的request域中取值:requestParams===================================" + requestParams);
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
// 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
params.put(name, valueStr);
}
// 2.封装必须参数
String out_trade_no = requests.getParameter("out_trade_no"); // 商户订单号
System.err.println("out_trade_no==================================" + out_trade_no);
String orderType = requests.getParameter("body"); // 订单内容
System.out.println("orderType==================================" + orderType);
String tradeStatus = requests.getParameter("trade_status"); // 交易状态
System.err.println("tradeStatus=================================" + tradeStatus);
// 3.签名验证(对支付宝返回的数据验证,确定是支付宝返回的)
boolean signVerified = false;
try {
// 3.1调用SDK验证签名
signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ali_public_key, AlipayConfig.input_charset);
System.out.println(signVerified);
} catch (Exception e) {
e.printStackTrace();
}
}
// 4.对验签进行处理
if (signVerified) { // 验签通过
if (tradeStatus.equals("TRADE_SUCCESS")) {// 只处理支付成功的订单:修改交易表状态,支付成功
下面的就是你们自己的业务逻辑了 :
成功和失败以后的逻辑了
好了,这就是支付宝app支付逻辑了,加签和验签的方法支付宝都封装好了,不需要我们自己写