学向勤中得,萤窗万卷书。这篇文章主要讲述商家 APP 如何接入新版支付宝支付,老版本商家如何升级相关的知识,希望能为你提供帮助。
代码地址如下:前言支付宝移动支付2.0版本对比1.0版本做了较大更新,新申请的商家都需要采用最新2.0版本 SDK 才可以成功接入,老版本需要升级的需要对 APP 进行重新签约才可以。
http://www.demodashi.com/demo/14006.html
老版本支付宝支付:
签名方式rsa1(sha1),支付宝公钥是确定的,每个商家的都是一样的。
新版本支付宝支付:
签名方式rsa2(sha256),支付宝公钥每个商家都是不同的。
升级程序实现 老版本java服务端代码:返回订单信息供客户端调起支付宝客户端:
public static String getOrderInfo(String subject, String body,
String tradeNo, String price, String notifyurl) {
// 签约合作者身份ID
String orderInfo = "partner=" + """ + getAliPartnerId(tradeNo)
+ """;
// 签约卖家支付宝账号
orderInfo += "&
seller_id=" + """ + getAliSellerId(tradeNo)
+ """;
// 商户网站唯一订单号
orderInfo += "&
out_trade_no=" + """ + tradeNo + """;
// 商品名称
orderInfo += "&
subject=" + """ + subject + """;
// 商品详情
orderInfo += "&
body=" + """ + body + """;
// 商品金额
orderInfo += "&
total_fee=" + """ + price + """;
// 服务器异步通知页面路径
orderInfo += "?ify_url=" + """ + notifyurl + """;
// 服务接口名称, 固定值
orderInfo += "&
service="mobile.securitypay.pay"";
// 支付类型, 固定值
orderInfo += "&
payment_type="1"";
// 参数编码, 固定值
orderInfo += "&
_input_charset="utf-8"";
// 设置未付款交易的超时时间
// 默认30分钟,一旦超时,该笔交易就会自动被关闭。
// 取值范围:1m~15d。
// m-分钟,h-小时,d-天,1c-当天(无论交易何时创建,都在0点关闭)。
// 该参数数值不接受小数点,如1.5h,可转换为90m。
// orderInfo += "&
it_b_pay="30m"";
// extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
// orderInfo += "&
extern_token=" + """ + extern_token + """;
// 支付宝处理完请求后,当前页面跳转到商户指定页面的路径,可空
// orderInfo += "&
return_url="m.alipay.com"";
// 调用银行卡支付,需配置此参数,参与签名, 固定值 (需要签约《无线银行卡快捷支付》才能使用)
// orderInfo += "&
paymethod="expressGateway"";
return orderInfo;
}
支付完成之后回调:
String trade = getPara("out_trade_no");
System.out.println("trade:" + trade);
// 验证支付宝请求
HashMap<
String, String>
paraMap = new HashMap<
>
();
Enumeration<
String>
paraNames = getParaNames();
for (Enumeration<
String>
e = paraNames;
e.hasMoreElements();
)
{
String thisName = e.nextElement().toString();
System.out.println(thisName + "-------------" + getPara(thisName));
paraMap.put(thisName, getPara(thisName));
}
if (!AlipayNotify.verify(paraMap))
{
renderText("false");
return;
}// 订单状态判断
String trade_status = getPara("trade_status");
if (trade_status.equals("WAIT_BUYER_PAY"))
{
logger.info("订单创建,等待用户支付");
renderText("success");
return;
}else if (trade_status.equals("TRADE_SUCCESS")||trade_status.equals("TRADE_FINISHED")) {
logger.info("订单支付成功,服务器处理");
if (dealWithOrder(trade, role, getPara("total_fee")))
{
renderText("success");
return;
}
}
renderText("false");
return;
新版本支付宝java: 支付宝公钥每个商家相同
public static String getNewOrderInfo(String appId,String subject, String body,String tradeNo, String price, String notifyurl) throws AlipayApiException{
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",appId,getAliPrivateKey(tradeNo),"json","utf-8",Constants.PAY_ZHIFUBAO_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(body);
model.setSubject(subject);
model.setOutTradeNo(tradeNo);
model.setTimeoutExpress("30m");
//一般用不到这个
model.setTotalAmount(price);
//这个嘛就是钱喽
model.setProductCode("QUICK_MSECURITY_PAY");
//商家和支付宝签约的产品码,为固定值
request.setBizModel(model);
request.setNotifyUrl(notifyurl);
//外网异步回调地址,是需要外网能够访问到的
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
return response.getBody();
//这里直接把订单信息给app端就好了,让他直接拿着去调起支付宝
}
支付宝回调:支付宝公钥每个商家不同
String trade = getPara("out_trade_no");
// 验证支付宝请求
HashMap<
String, String>
params = new HashMap<
>
();
Map<
String,String []>
requestParams = getParaMap();
for (Iterator<
String>
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);
}
if (!AlipaySignature.rsaCheckV1(params, aliPublicKey, "utf-8", "RSA2")) {
renderText("false");
return;
}
// 订单状态判断
String trade_status = getPara("trade_status");
if (trade_status.equals("TRADE_SUCCESS") || trade_status.equals("TRADE_FINISHED")) {
logger.info("订单支付成功,服务器处理");
if (dealWithOrder(trade, role, getPara("total_amount"))) {
renderText("success");
return;
}
}
renderText("false");
return;
项目结构图:【商家 APP 如何接入新版支付宝支付,老版本商家如何升级】
文章图片
项目运行图:
文章图片
其他新老版本对比详细链接:https://docs.open.alipay.com/203/106514商家 APP 如何接入新版支付宝支付,老版本商家如何升级
代码地址如下:
http://www.demodashi.com/demo/14006.html
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
推荐阅读
- iPhone/iPad/Android UI尺寸规范
- 头条Android 屏幕适配
- HDU5119 - Happy Matt Friends
- Android异步框架RxJava 1.x系列 - 事件及事件序列转换原理
- HDU 5119 Happy Matt Friends
- 关于升级到Android Studio3.2版本的注意事项
- Android的15大最佳慢动作视频应用软件下载推荐(你最喜欢哪个())
- Android和iOS的15款最佳戒烟应用软件下载推荐(哪款适合你())
- Android和iOS的10个最佳对讲机应用软件下载推荐(你需要哪个())