支付宝支付相比于微信支付要简单点,支付流程如下所示,之前介绍过微信支付(一)、(二)、(三),在此基础上继续完善支付宝支付。

一、前期准备工作

首先根据支付宝官方文档拿到一些参数,主要是APPID,商户应用私钥和公钥,支付宝公钥,授权回调地址。



这里对于准备工作省略!

二、Springboot后端

导入依赖

        <!--支付宝支付SDK--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.21.10.ALL</version></dependency>
WxPayController
/*** 支付宝下单* @return* @throws Exception*/@ApiOperation("调用统一下单API,生成支付宝下单的请求")@PostMapping("/alipay/order")public R AliPay() throws Exception {log.info("发起支付宝支付请求 Alipay");//返回支付所需要的参数给Android端String resultdata = wxPayService.aliPay();log.info("map====>{}",resultdata);return R.ok().data("result",resultdata);}/*** 支付宝支付通知* 微信支付通过支付通知接口将用户支付成功消息通知给商户*/@ApiOperation("支付通知")@PostMapping("/app/alinotify")public String AliNotify(HttpServletRequest request) throws AlipayApiException, UnsupportedEncodingException {//获取支付宝POST过来反馈信息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对应应用下查看。
//公钥证书模式验签,alipayPublicCertPath是支付宝公钥证书引用路径地址,需在对应应用中下载
//boolean signVerified= AlipaySignature.rsaCertCheckV1(params, alipayPublicCertPath, "GBK","RSA2");
//普通公钥模式验签,切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。boolean flag = AlipaySignature.rsaCheckV1(params, ALIPAY_PUBLIC_KEY, "UTF-8","RSA2");/* 实际验证过程建议商户务必添加以下校验:1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)4、验证app_id是否为该商户本身。*/if(flag) {//验证成功//商户订单号String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");//支付宝交易号String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");//交易状态String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");if(trade_status.equals("TRADE_FINISHED")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知}else if (trade_status.equals("TRADE_SUCCESS")){//判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//如果有做过处理,不执行商户的业务程序//注意://付款完成后,支付宝系统发送该交易状态通知}System.out.println("success");}else {//验证失败System.out.println("fail");}return null;}/*** 支付宝查单* @param orderNo* @param* @return* @throws Exception*/@ApiOperation("支付宝查单")@GetMapping("/queryali/{orderNo}")//也可以用微信的订单号查询public R queryAliOrder(@PathVariable String orderNo) throws Exception {log.info("查询支付宝订单");String result = wxPayService.queryAliOrder(orderNo);return R.ok().setMessage("查询成功").data("result", result);}
WxPayService
/*** 支付宝支付* @return*/String aliPay() throws AlipayApiException;/*** 支付宝查单* @param orderNo* @param* @return*/String queryAliOrder(String orderNo) throws AlipayApiException;
WxPayServiceImpl
 /*** 支付宝支付* @return*/@Overridepublic String aliPay() throws AlipayApiException {/** 支付宝网关 **/String URL = "https://openapi.alipay.com/gateway.do";/** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/String APP_ID = "写自己的";/** 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/String APP_PRIVATE_KEY = "写自己的";/** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/String ALIPAY_PUBLIC_KEY = "写自己的";/** 初始化 **/AlipayClient alipayClient = new DefaultAlipayClient(URL,APP_ID,APP_PRIVATE_KEY,"json","UTF-8",ALIPAY_PUBLIC_KEY,"RSA2");/** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称: alipay.trade.app.pay(app 支付接口) **/AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();/** 设置业务参数 **/AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();/** 商户订单号,商户自定义,需保证在商户端不重复,如:20200612000001 **/model.setOutTradeNo(OrderNoUtils.getOrderNo());/** 订单标题 **/model.setSubject("whq烤肉byali");/** 销售产品码,固定值:QUICK_MSECURITY_PAY **/model.setProductCode("QUICK_MSECURITY_PAY");/** 订单金额,精确到小数点后两位 **/model.setTotalAmount("0.01");/** 订单描述 **/model.setBody("订单描述");/** 业务扩展参数 **///ExtendParams extendParams = new ExtendParams();/** 花呗分期参数传值前提:必须有该接口花呗收款准入条件,且需签约花呗分期 **//** 指定可选期数,只支持3/6/12期,还款期数越长手续费越高 **/// extendParams.setHbFqNum("3");/** 指定花呗分期手续费承担方式,手续费可以由用户全承担(该值为0),也可以商户全承担(该值为100),但不可以共同承担,即不可取0和100外的其他值。 **///extendParams.setHbFqSellerPercent("0");//model.setExtendParams(extendParams);/** 将业务参数传至request中 **/request.setBizModel(model);/** 异步通知地址,以http或者https开头的,商户外网可以post访问的异步地址,用于接收支付宝返回的支付结果,如果未收到该通知可参考该文档进行确认:https://opensupport.alipay.com/support/helpcenter/193/201602475759 **/request.setNotifyUrl("写自己的");/**第三方调用(服务商模式),传值app_auth_token后,会收款至授权token对应商家账号,如何获传值app_auth_token请参考文档:https://opensupport.alipay.com/support/helpcenter/79/201602494631 **///request.putOtherTextParam("app_auth_token", "传入获取到的app_auth_token值");AlipayTradeAppPayResponse response = null;try {/** 通过alipayClient调用API,获得对应的response类  **/response = alipayClient.sdkExecute(request);} catch (AlipayApiException e) {e.printStackTrace();}/** response.getBody()打印结果就是orderString,可以直接给客户端请求,无需再做处理。 如果传值客户端失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/89 **/System.out.println(response.getBody());return response.getBody();}/*** 支付宝查单* @param orderNo* @param* @return*/@Overridepublic String queryAliOrder(String orderNo) throws AlipayApiException {/** 支付宝网关 **/String URL = "https://openapi.alipay.com/gateway.do";String APP_ID = "写自己的";/** 应用私钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602469554 **/String APP_PRIVATE_KEY = "写自己的";/** 支付宝公钥,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602487431 **/String ALIPAY_PUBLIC_KEY = "写自己的";AlipayClient alipayClient = new DefaultAlipayClient(URL ,APP_ID ,APP_PRIVATE_KEY,"json","UTF-8",ALIPAY_PUBLIC_KEY,"RSA2");AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", orderNo);
//bizContent.put("trade_no", "2014112611001004680073956707");request.setBizContent(bizContent.toString());AlipayTradeQueryResponse response = alipayClient.execute(request);log.info("明文数据 ===> {}", response.getBody());if(response.isSuccess()){System.out.println("调用成功");} else {System.out.println("调用失败");}return response.getBody();}

在这里也可以将申请到的参数放在配置文件中,我测试时直接写在代码中了。

三、Android端

Android端按照文档导入SDK。下面直接放代码

PayResult
public class PayResult {private String resultStatus;private String result;private String memo;public PayResult(Map<String, String> rawResult) {if (rawResult == null) {return;}for (String key : rawResult.keySet()) {if (TextUtils.equals(key, "resultStatus")) {resultStatus = rawResult.get(key);} else if (TextUtils.equals(key, "result")) {result = rawResult.get(key);} else if (TextUtils.equals(key, "memo")) {memo = rawResult.get(key);}}}@Overridepublic String toString() {return "resultStatus={" + resultStatus + "};memo={" + memo+ "};result={" + result + "}";}/*** @return the resultStatus*/public String getResultStatus() {return resultStatus;}/*** @return the memo*/public String getMemo() {return memo;}/*** @return the result*/public String getResult() {return result;}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".WeChatPay"><Buttonandroid:id="@+id/wechatpay"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="微信支付"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.501"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"app:layout_constraintVertical_bias="0.322" /><Buttonandroid:id="@+id/aliPay"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="支付宝支付"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.501"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/wechatpay"app:layout_constraintVertical_bias="0.197" />
</android.support.constraint.ConstraintLayout>
WeChatPay
public class WeChatPay extends AppCompatActivity {private Button wechatpay;private Button Alipay;//    private final IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null);private IWXAPI msgApi;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_we_chat_pay);wechatpay = findViewById(R.id.wechatpay);Alipay = findViewById(R.id.aliPay);//初始化操作msgApi = WXAPIFactory.createWXAPI(this, null);msgApi.registerApp(Constants.APP_ID);wechatpay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {getWeChatPayData();}});Alipay.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {getAliPayData();}});}private void getWeChatPayData(){new Thread(new Runnable() {@Overridepublic void run() {MediaType JSON = MediaType.parse("application/json;charset=utf-8");JSONObject jsonObject = new JSONObject();//创建OkHttp对象OkHttpClient httpClient = new OkHttpClient();try {//                    jsonObject.put("productId",1);RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));String url = "写自己的";Request request = new Request.Builder().url(url).post(requestBody).build();//发送请求获取返回数据Response response = httpClient.newCall(request).execute();Log.d("WcChatPay","请求APP下单");//处理返回的数据String resData = response.body().string();Message message = new Message();message.what = 1;message.obj = resData;wechathandeler.sendMessage(message);}catch (Exception e){e.printStackTrace();}}}).start();}private void getAliPayData(){new Thread(new Runnable() {@Overridepublic void run() {MediaType JSON = MediaType.parse("application/json;charset=utf-8");JSONObject jsonObject = new JSONObject();//创建OkHttp对象OkHttpClient httpClient = new OkHttpClient();try {//                    jsonObject.put("productId",1);RequestBody requestBody = RequestBody.create(JSON, String.valueOf(jsonObject));String url = "写自己的";Request request = new Request.Builder().url(url).post(requestBody).build();//发送请求获取返回数据Response response = httpClient.newCall(request).execute();Log.d("AliPay","请求APP下单");//处理返回的数据String resData = response.body().string();Message message = new Message();message.what = 2;message.obj = resData;wechathandeler.sendMessage(message);}catch (Exception e){e.printStackTrace();}}}).start();}/*** 支付宝支付* @param orderInfo*/private void AliPay(String orderInfo) {Runnable payRunnable = new Runnable() {@Overridepublic void run() {PayTask alipay = new PayTask(WeChatPay.this);Map<String, String> result = alipay.payV2(orderInfo, true);Message msg = new Message();msg.what = 3;msg.obj = result;wechathandeler.sendMessage(msg);}};// 必须异步调用Thread payThread = new Thread(payRunnable);payThread.start();}@SuppressLint("HandlerLeak")Handler wechathandeler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what){case 1://微信try {JSONObject jsonObject = new JSONObject(msg.obj.toString());JSONObject resultData = new JSONObject(jsonObject.getString("data"));
//                        JSONObject resultData = data.getJSONObject("result");String appid = resultData.getString("appid");String partnerid = resultData.getString("partnerid");String noncestr = resultData.getString("noncestr");String packagevalue = resultData.getString("packagevalue");String prepayid = resultData.getString("prepayid");String sign = resultData.getString("sign");String timestamp = resultData.getString("timestamp");//调起支付PayReq request = new PayReq();request.appId = Constants.APP_ID;request.partnerId = partnerid;request.prepayId = prepayid;request.packageValue = packagevalue;request.nonceStr = noncestr;request.timeStamp = timestamp;request.sign = sign;Log.d("WcChatPay","sign====>"+sign);msgApi.sendReq(request);Log.d("WcChatPay","调起支付");} catch (JSONException e) {e.printStackTrace();}break;case 2:try {JSONObject jsonObject = new JSONObject(msg.obj.toString());String paydata =  jsonObject.getString("data");JSONObject returndata = new JSONObject(paydata);String resultdata =  returndata.getString("result");AliPay(resultdata);} catch (JSONException e) {e.printStackTrace();}break;case 3:PayResult payResult = new PayResult((Map<String, String>) msg.obj);/*** 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。*/String resultStatus = payResult.getResultStatus();// 判断resultStatus 为9000则代表支付成功if (TextUtils.equals(resultStatus, "9000")) {// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。Toast.makeText(WeChatPay.this,"支付成功",Toast.LENGTH_LONG).show();Log.d("AliPay","支付成功"+payResult);} else {// 该笔订单真实的支付结果,需要依赖服务端的异步通知。Toast.makeText(WeChatPay.this,"支付失败",Toast.LENGTH_LONG).show();Log.d("AliPay","支付失败"+payResult);}}}};}

四、测试



支付宝APP支付-Android+springboot搭建后端相关推荐

  1. java后端实现集成支付宝APP支付(沙箱环境)

    沙箱环境集成支付宝APP支付后端实现 前言 获取支付宝相关信息 整体开发流程 1.获取核心参数 2.将支付宝SDK集成到项目中 3.后台使用支付宝SDK与支付宝进行交互逻辑 1.将支付宝公共信息参数写 ...

  2. android通过webview调起支付宝app支付

    android通过webview调起支付宝app支付 webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这 ...

  3. java SpringBoot 对接支付宝 APP支付 证书模式及非证书模式

    一. 添加maven依赖 sdk <dependency><groupId>com.alipay.sdk</groupId><artifactId>al ...

  4. java app支付_【支付宝支付】Java实现支付宝APP支付流程

    前言 官方文档 开放能力文档: APP支付接口API 开发准备工作 后端代码实现 参数配置 application.yml # 支付宝相关 ALIPAY: # 应用ID APP_ID: # 应用私钥 ...

  5. 【支付宝支付】Java实现支付宝APP支付流程

    前言 微信登录网页授权与APP授权 微信JSAPI支付 微信APP支付 微信APP和JSAPI退款 支付宝手机网站支付 支付宝APP支付 支付宝退款 以上我都放到个人公众号,搜一搜:JAVA大贼船,文 ...

  6. 支付宝app支付功能-服务端的实现-python3版

    支付宝app支付功能-服务端的实现-python3版 一:需求说明 二:支付宝app支付处理流程 三:所需依赖 3.1 依赖库 3.2 支付配置 3.2.1 沙箱环境配置 3.2.2 正式环境配置 四 ...

  7. aliPay支付宝APP支付操作流程

    [TOC] aliPay支付宝APP支付操作流程 1 注册帐号&官方文档解析 在支付宝商家中心注册帐号,已经拥有支付宝帐号的用户,直接登录商家中心即可(同一个支付宝帐号,可以既是买家也是商家) ...

  8. 支付宝 app支付 沙盘使用

    支付宝 app支付 沙盘使用 文档说明 沙箱测试: App支付沙箱接入注意点 1.app支付支持沙箱接入:在沙箱调通接口后,必须在线上进行测试与验收,所有返回码及业务逻辑以线上为准: 2.app支付只 ...

  9. 支付宝APP支付(java后台版)

    本实例是基于springBoot框架编写 一.流程步骤          1.执行流程            当手机端app在支付页面时,调起服务端创建订单(自己公司业务接口)接口,后台把需要调起支付 ...

  10. app支付宝支付java后台_支付宝app支付java后台流程demo

    支付宝app支付java后台流程demo 使用ssm框架实现支付宝支付功能. 支付宝测试环境代码测试 源代码 https://github.com/OUYANGSIHAI/sihai-maven-ss ...

最新文章

  1. Wireshark如何选择多行
  2. html表单和输入方法,HTML 表单和输入
  3. MySQL数据库的优化-运维架构师必会高薪技能,笔者近六年来一线城市工作实战经验...
  4. 7_python基础—while循环应用1-100累加和
  5. 大数据之-Hadoop3.x_Hadoop_MapReduce_介绍---大数据之hadoop3.x工作笔记0081
  6. double write buffer
  7. WebGL笔记(二):顶点着色
  8. NOIP2017 普及组题解
  9. php万能表单制作教程,万能表单 · 极致CMS建站系统帮助文档 · 看云
  10. 计算机派位志愿填报技巧,小升初电脑派位 填报也有技巧
  11. 互联网是如何工作的?
  12. 【软件介绍】IGV软件的安装和基本介绍
  13. Vue-Router给当前url添加参数时报错 Navigation Duplicated Avoided redundant navigation to current location
  14. 2022第十二届中国电子文件管理论坛嘉宾揭晓
  15. pmp考试多长时间出成绩?
  16. 【计导非课系列】 第五节 二进制 进制计算 编码
  17. 超详细:将iPhone中音乐导出到电脑里的简单方法(完美支持最新iOS15.2系统)
  18. 记录人生第一次收获offer的艰辛
  19. Ubuntu20.04+Linux5.8.8 添加系统调用实现进程隐藏
  20. 让你的写作变得更加高效——最新文章生成工具推荐

热门文章

  1. 腾讯云网站备案咨询:网站信息类问题汇总解答
  2. WdatePicker 诱发 “无法打开站点,已终止操作”错误
  3. Blend for Visual Studio
  4. java ckfinder_java 使用ckfinder
  5. Web网站模板-健身房宣传响应式网站模板(HTML+CSS+JavaScript)
  6. 上海迪士尼乐园推出全新夜间演出;咖世家在中国推出风味冷萃系列即饮咖啡 | 美通企业日报...
  7. 八卦掌桩功-定式八桩及相关资料
  8. iOS9 In-house 未受信任的企业级开发者
  9. 论文写作 2: 常见的 Latex 格式文件
  10. 【绝知此事要躬行】线性表之链表OJ(上)