1、进入支付宝蚂蚁金服开放平台建立一个应用

可以看到有一个(网页&移动应用的),进入开放平台创建一个这样的应用就可以了

如果你是首次会看到一个让你填写信息加入平台的页面。

创建完应用后你将得到以下页面:

也可以给你创建的应用增加能力,比如APP支付能力,获取会员信息等等。需要注意的是有些功能是需要签约的。如下图所示:

2、接入支付sdk,服务端jar包

com.alipay.sdk

alipay-sdk-java

4.3.0.ALL

3、下单处理代码

AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();

model.setBody("购买["+placeOrderForm.getProductName()+"]");

model.setSubject("购买xxx["+placeOrderForm.getProductName()+"]");

model.setOutTradeNo(order.getUuid());

model.setTotalAmount(String.valueOf(order.getTotalOrderPrice()));

try {

String orderString = alipaySao.createALipayTrade(model);

Map resultMap = ImmutableMap.of("orderString",orderString,"orderNo",order.getUuid());

//更新订单为支付中

this.updatePayStatus(order.getUuid(),PayStatusEnum.PAYING.getCode(),"");

return ResponseVo.buildSuccessResponse(resultMap);

} catch (AlipayApiException e) {

log.error("AlipayApiException e={}",e);

return ResponseVo.buildResponse(ResponseEnum.ALIPAY_ERROR);

}

4、与支付宝进行通信

初始化:

// 实例化客户端

alipayClient = new DefaultAlipayClient(

AlipayConfig.ALIPAY_URL,

AlipayConfig.APP_ID,

AlipayConfig.PRIVATE_KEY,

AlipayConfig.FORMAT,

AlipayConfig.CHARSET,

AlipayConfig.ALIPAY_PUBLIC_KEY,

AlipayConfig.SIGN_TYPE);

/**

* 支付客户端

* @throws AlipayApiException

* @return

*/

@Override

public String createALipayTrade(AlipayTradeAppPayModel model) throws AlipayApiException {

// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay

AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。

model.setTimeoutExpress("60m");

model.setProductCode("QUICK_MSECURITY_PAY");

request.setBizModel(model);

request.setNotifyUrl(AlipayConfig.CALLBACK_URL);

//异步回调url

// 这里和普通的接口调用不同,使用的是sdkExecute

AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

log.info("apliay.response.body={}",response.getBody());

//就是orderString 可以直接给客户端请求,无需再做处理。

return response.getBody();

}

5、支付宝相关配置(实际应用建议使用配置项管理)

package com.fast.tpp.dto;

public class AlipayConfig {

/**

* 签约的支付宝账号对应的支付宝唯一用户号,以2088开头的16位纯数字组成

*/

public static final String PID = "xx";

/**

* 正式环境请求地址

*/

public static String ALIPAY_URL = "https://openapi.alipay.com/gateway.do";

/**

* 支付宝分配给开发者的应用ID

*

*/

public static String APP_ID = "xxx";

/**

* 仅支持JSON

*/

public static String FORMAT = "JSON";

/**

* 请求使用的编码格式

*/

public static String CHARSET = "utf-8";

/**

* 商户生成签名字符串所使用的签名算法类型

*/

public static String SIGN_TYPE = "RSA2";

/**

* 支付宝公钥

*/

public static String ALIPAY_PUBLIC_KEY =xxx;

/**

* 商户私钥

*/

public static String PRIVATE_KEY =XXX";

/**

* 回调地址

*/

public static String CALLBACK_URL = "xxx";

}

6、支付状态设置

package com.fast.common.enums;

/**

* 支付状态

*/

public enum PayStatusEnum {

NOT_PAY(0,"未支付"),

PAYING(1, "支付中"),

SUCCESS(2,"支付成功"),

FAILUE(3, "支付失败"),

;

private int code;

private String value;

PayStatusEnum(int code, String value){

this.code = code;

this.value = value;

}

// 获取对应的文本

public static String getName(int code) {

for (PayStatusEnum c : PayStatusEnum.values()) {

if (c.getCode() == code) {

return c.value;

}

}

return null;

}

public int getCode() {

return code;

}

public void setCode(int code) {

this.code = code;

}

public String getValue() {

return value;

}

public void setValue(String value) {

this.value = value;

}

}

7、回调通知接口

/**

* 支付宝支付通知

* @param request

* @param response

* @return

* @throws IOException

*/

@RequestMapping(value="/alipayNotice.do",method = RequestMethod.POST)

@ResponseBody

@NoneAuth

@SysLog(actionName = "支付宝支付通知")

public String alipayNotice(HttpServletRequest request, HttpServletResponse response) throws IOException {

Map params = new HashMap();

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] + ",";

}

params.put(name, valueStr);

}

// 切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。

try {

boolean flag = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET,

AlipayConfig.SIGN_TYPE);

if (flag) {

String tradeStatus = params.get("trade_status");

String outTradeNo = params.get("out_trade_no");

String tradeNo = params.get("trade_no");

//购买者用户ID

String openId = params.get("buyer_logon_id");

this.orderService.alipayNotice(tradeStatus,outTradeNo,tradeNo,openId);

if ("TRADE_SUCCESS".equals(tradeStatus)){

return "success";

}

}

} catch (Exception e) {

e.printStackTrace();

}

return "fail";

}

对应的service方法为:

/**

* 支付宝支付通知

* @param tradeStatus

* @param outTradeNo

* @param tradeNo

* @param openId

*/

public void alipayNotice(String tradeStatus, String outTradeNo, String tradeNo, String openId){

log.info("alipayNotice outTradeNo={} tradeStatus={}",outTradeNo,tradeNo);

String orderNo = outTradeNo;

if ("TRADE_SUCCESS".equals(tradeStatus)) {

// 交易支付成功的执行相关业务逻辑

Order order = this.getOrderByOrderNo(orderNo);

if(null==order){

return;

}

//只有在未支付成功的状态下才可以发短信和更新生效时间

if (order.getPayStatus()!=PayStatusEnum.SUCCESS.getCode()){

this.orderMapper.updatePrepayId(tradeNo,orderNo);

//处理支付成功逻辑

handlePaySuccess(order,openId);

}

} else if ("TRADE_CLOSED".equals(tradeStatus)) {

// 未付款交易超时关闭,或支付完成后全额退款,执行相关业务逻辑

//失败 更改订单状态为支付失败

this.updatePayStatus(outTradeNo,PayStatusEnum.FAILUE.getCode(),openId);

}

}

```

app支付宝支付java后台_手机APP如何接入支付宝支付(java后台)相关推荐

  1. app怎么调用mysql数据_手机app怎么调用php操作数据库的接口?

    做毕设项目,现在需求很简单,php文件放在服务器上,作用是获取mysql数据库的数据. 服务器端php代码如下: header('Access-Control-Allow-Origin:*'); // ...

  2. 多个app用同一个签名文件_手机APP和手机网站的区别有哪些?

    最近我们家客服经常接到咨询电话,了解手机APP和手机网站这两个产品的区别,各位朋友记住了哦,手机APP和手机网站虽然都是通过手机使用的产品,但是这两个不属于同一个产品哦.那么,你知道手机APP和手机网 ...

  3. qtreewidget点击空白处时取消以选项_手机APP自动续费,我们要如何取消?

    随着各大视频网站内容IP的打造 追剧男孩女孩的钱包有点儿紧 A视频APP能看"妻子2" B视频APP能看"都挺好" A视频APP会员能看"东宫&quo ...

  4. 苹果手机如何关闭自动续费_手机APP会员自动续费怎么办?教你一招快速关闭!...

    做最有趣有料的科技自媒体 你们知道学霸君每个月最讨厌收到什么短信吗? 就是APP自动续费的短信.... 特别是有一些软件,明明百八年前就已经没用了 当时只是因为年少无知觉得会员包月续费开通会比较便宜, ...

  5. 怎么关闭苹果手机自动扣费_手机APP「会员自动续费」怎么办?教你一招快速关闭...

    你们知道学霸君每个月最讨厌收到什么短信吗? 就是APP自动续费的短信.... 特别是有一些软件,明明百八年前就已经没用了 当时只是因为年少无知觉得会员包月续费开通会比较便宜,所以才开通的. 每次收到它 ...

  6. 手机h5 java平台_H5 手机 App 开发入门:技术篇

    1.手机 App 的技术栈 手机 App 的技术栈可以分成三类 原生 App 技术栈 原生技术栈指的是,只能用于特定手机平台的开发技术.比如,安卓平台的 Java 技术栈,iOS 平台的 Object ...

  7. 安卓app开发工具_手机APP开发会涉及到哪些知识点呢?

    随着智能手机的产生,许多APP开始衍生,那么手机APP开发涉及到哪些知识呢?米么信息小编整理了以下内容,一起来看看吧! 手机应用主要分为两大类,一类是基于iPhone(ios)系统APP,另一类则是基 ...

  8. app模式会被第三方平台模式取代吗_手机 App 不能取代第三方浏览器的原因是什么?...

    嘿嘿,中午在 @邹剑波Kant 的答案下留言说我也写一写,那么我就也写一下: 话说最近真是喜欢晒数据,那么我们先看 2个数据吧: 这两张图表的数据来源是Talking Data在2015年年初发布的一 ...

  9. 安卓app开发工具_手机APP是怎么开发的,需要学习哪些知识?

    目前主流的手机APP分两类,一类是基于苹果(IOS)系统的APP,另一类是基于安卓(Android)系统的APP,两种不同系统的APP所使用的开发工具及编程语言完全不一样. (1)基于苹果(IOS)系 ...

  10. 移动端---混合开发1 + 支付相关操作(手机app支付、网页支付)--支付流程

    混合开发 1️⃣ 以前端为主导进行开发(Hybrid app)(即所有的页面部分都是用网页 h5 的技术来做的,Hybrid 是做编辑器的) uniapp.mui 是国内主流的小公司做混合开发的技术. ...

最新文章

  1. 以太坊智能合约Demo
  2. Chrome 科研神器!论文代码快速复现
  3. Node.js 执行webpack命令出现的错误
  4. redis List的用途及常用命令
  5. 阿里云云效如何保障双11大型项目管理
  6. python字典与顺序有关吗_python – 为什么在字典和集合中的顺序是任意的?
  7. 3张报表搞定财务分析
  8. 解锁lintcode-猫和狗的问题
  9. AB PLC软件如何破解?
  10. SmartAdmin(SmartAdmin_v1.5.2)
  11. java ape格式转换_ape格式怎么转换mp3?ape转换mp3的正确方法
  12. 大家都在问华为手机图片怎么拼图?只需几步就可实现
  13. Myeclipse报错:The word is not correctly spelled
  14. 华为交换机添加用户及用户等级
  15. poker游戏编码规则
  16. 简单典型二阶系统_MIT—微分方程与线性代数笔记2.1 二阶常微分方程
  17. 蚂蚁区块链第22课 蚂蚁区块链溯源服务功能从开通到实现
  18. 洛谷P1460 [USACO2.1]健康的荷斯坦奶牛 Healthy Holsteins
  19. Unity Shader 表面着色器边缘光(Rim Lighting)二
  20. 星女郎PK谋女郎 颜值衣品谁更胜一筹?

热门文章

  1. 深度学习二分类问题--IMDB数据集
  2. (一百二十三)Android O 了解wifi eap中的anonymous identity
  3. Hbase跨集群数据同步验证
  4. Linux从入门到精通二(Windows:你知道我的兄弟Linux吗?)
  5. 反病毒技术及其发展趋势
  6. mysql pdo 端口_pdo连接mysql
  7. 面完18家大厂的算法岗位,吐血整理了一个面经!
  8. java中write方法作用_JAVA中的懒人神器—方法(有返回值)
  9. 项目开发中的人月及如何计算
  10. 桌面视频录制软件有哪些?怎么简单又快地录制视频?