代码地址如下:
http://www.demodashi.com/demo/14006.html

前言

支付宝移动支付2.0版本对比1.0版本做了较大更新,新申请的商家都需要采用最新2.0版本 SDK 才可以成功接入,老版本需要升级的需要对 APP 进行重新签约才可以。

老版本支付宝支付:

签名方式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;

项目结构图:

项目运行图:

其他

新老版本对比详细链接:https://docs.open.alipay.com/203/106514商家 APP 如何接入新版支付宝支付,老版本商家如何升级

代码地址如下:
http://www.demodashi.com/demo/14006.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

商家 APP 如何接入新版支付宝支付,老版本商家如何升级的更多相关文章

  1. Android最新版支付宝支付集成

    上次集成支付宝支付已经很久了,今天写东西用到了支付宝支付,就大致写一下流程: 去蚂蚁金服下载最新版的Android&IOS端SDK 全部文档 -- 资源下载 -- App支付客户端 下载后解压 ...

  2. 使用Tornado异步接入第三方(支付宝)支付

    目前国内比较流行的第三方支付主要有支付宝和微信支付,博主最近研究了下如何用Python接入支付宝支付,这里我以Tornado作为web框架,接入支付宝构造支付接口. 使用Tornado异步接入支付宝支 ...

  3. asp.net mvc 接入最新支付宝支付+退款 alipay-sdk-NET-20170615110549

    第1步: https://openhome.alipay.com/developmentDocument.htm 第2步:下载sdk和demo https://docs.open.alipay.com ...

  4. iOS:App上架流程和支付宝支付流程

    App上架大致流程: 1.花99美元在苹果开发中心注册一个开发者账号: 2.登陆开发者账号,进入member Center,即开发者成员中心: 3.选取证书标示符(certificates Ident ...

  5. android app 集成 支付宝支付 微信支付

    项目中部分功能点需要用到支付功能,移动端主要集成支付宝支付和微信支付 支付宝sdk以及demo下载地址:https://doc.open.alipay.com/doc2/detail.htm?spm= ...

  6. 支付宝支付之扫码支付(电脑网站支付)、H5支付(手机网站支付)相关业务流程分析总结

    前言 在上一篇文章<微信支付之扫码支付.公众号支付.H5支付.小程序支付相关业务流程分析总结>中,分析和总结了微信支付相关支付类型的业务流程,这里作为与微信支付平起平坐不相伯仲的支付宝支付 ...

  7. laravel实现支付宝支付功能

    起因 前段时间因为项目中需要实现支付宝手机网站支付功能,所以写下这篇文章以作记录,不足之处,欢迎指教. 后端框架:Laravel 5.5 业务功能 适用于商家在移动端网页应用中集成支付宝支付功能.商家 ...

  8. APP支付宝支付接入

    1.app支付简介 买家可以在手机,掌上电脑等无线设备的应用程序内,通过支付宝(支付宝app或网页版支付宝)付款购买商品,且资金实行实时到账. 2.申请条件 1.申请前必须拥有经过实名认证的支付宝账户 ...

  9. 前后端分离djangorestframework—— 接入支付宝支付平台

    支付宝 简介 支付宝是什么不用多说了,本次教程适合初学者 前提准备 话不多说,干就完了 1.注册开发者账号,设置公钥私钥 首先进入支付宝开发者平台:传送门 ,有账号直接登录,没账号用你平时用来付款收钱 ...

随机推荐

  1. 由于拷贝的文件太大,不可能一直开着SHELL,所以让SCP后台运行

    原文地址: http://blog.itpub.net/90618/viewspace-750822/ 1:开一个终端,scp命令运行后,输入密码让其拷贝 # scp chris@221.179.1. ...

  2. IOS在一个程序中启动另一个程序

    尽管iPhone不允许同时运行两个应用程序,我们可以从自己的应用程序中启动另一个应用程序,并且可以在应用程序之间共享数据.我们可以使用UIApplication类的openURL:方法从一个应用程序来 ...

  3. arcgis python添加几何属性

    import arcpy import numpy import math def AddGeometryAttributes(fc, geomProperties, lUnit, aUnit, cs ...

  4. Java Net版短网址(ShortUrl)的算法及实现 待续

    算法 1)将长网址md5生成32位签名串,分为4段, 每段8个字节; 2)对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理; 3) ...

  5. 《逆袭大学:传给IT学子的正能量》

    <逆袭大学:传给IT学子的正能量> 基本信息 作者: 贺利坚 丛书名: 图灵原创 出版社:人民邮电出版社 ISBN:9787115347473 上架时间:2014-3-3 出版日期:201 ...

  6. Flask 学习(三)模板

    Flask 学习(三)模板 Flask 为你配置 Jinja2 模板引擎.使用 render_template() 方法可以渲染模板,只需提供模板名称和需要作为参数传递给模板的变量就可简单执行. 至于 ...

  7. Android常用http请求框架 简介及现状

    JDK支持的HttpUrlConnection HttpUrlConnection是JDK里提供的联网API,是最原始最基本的API,大多数开源的联网框架基本上也是基于此进行的封装的.HttpUrlC ...

  8. 记录C#错误日志工具

    在编程过程中,我们经常会用try...catch处理可能出错的代码块.如果程序出现错误,则直接show出错误信息. 当然,大型的系统都有错误日志处理模块,用数据库记录错误日志信息,有相应的写入错误日志 ...

  9. QlikView图表显示同比数据

    数据准备例如以下: SalesData: LOAD Num(ID) as ID, Date(Date) as Date, Month, Num(Year) as Year, Num(Sales) as ...

  10. 【小程序】wxs使用

    wxs使用 WXS(WeiXin Script)是小程序的一套脚本语言,结合WXML,可以构建出页面的结构. wxs可以说就是为了满足能在页面中使用js存在的,在wxml页面中,只能在插值{{ }}中 ...