本篇主要讲解APP接入支付宝支付完整流程,包含服务端,内容稍长

要接入支付宝支付,需要将APP在支付宝平台创建应用,提交审核,并进行商户签约以获得支付能力

详细参阅官方文档https://docs.open.alipay.com/399/106917/

下面主要从技术角度去讲解下流程

开发设置中一定要配置好APP相关信息,支付宝网关地址是固定的,授权回调地址即是你成功支付后的回调地址,对于支付结果,请商户依赖服务端的异步通知结果 ,同步通知结果,仅作为支付结束的通知,支付宝网关地址如果不配置,会造成即使你的授权回调地址正确,支付服务端也收不到任何的支付通知的信息(之前没注意这个问题,郁闷了俩小时)

支付宝平台为开发者们提供个很好的沙箱测试工具,即使应用没有提交上线,也可以在沙箱环境中模拟一个APP去接入支付,并配置相关参数,如密钥,应用网关,回调地址等等,这样既能很好的测试程序是否能够正常支付,同时减少提交上线审核后出现的一些问题

主要内容:首先是客户端SDK请求商户服务端,获取签名后的订单信息,再去调用支付接口,发起支付请求(提示:如果是支付APP沙箱测试,需要在onCreate方法中加入EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX); )

先上图再上代码

try {String url = "http://xxx.com/AliPay?user_id=" + account + "&totalFee=" + total_fee;byte[] buf = Util.httpGet(url);if (buf != null && buf.length > 0) {orderInfo = new String(buf);} else {Log.d("PAY_GET", "服务器请求错误");Toast.makeText(MainActivity.this, "服务器请求错误", Toast.LENGTH_SHORT).show();}} catch (Exception e) {Log.e("PAY_GET", "异常:" + e.getMessage());}Runnable payRunnable = new Runnable() {@Overridepublic void run() {PayTask alipay = new PayTask(MainActivity.this);Map<String, String> result = alipay.payV2(orderInfo, true);Log.i("msp", result.toString());Message msg = new Message();msg.what = SDK_PAY_FLAG;msg.obj = result;mHandler.sendMessage(msg);}};Thread payThread = new Thread(payRunnable);payThread.start();}

完成支付后返回通知支付结果

private Handler mHandler = new Handler() {@Override@SuppressWarnings("unused")public void handleMessage(Message msg) {switch (msg.what) {case SDK_PAY_FLAG: {@SuppressWarnings("unchecked")PayResult payResult = new PayResult((Map<String, String>) msg.obj);/*** 对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。*/String resultInfo = payResult.getResult();// 同步返回需要验证的信息String resultStatus = payResult.getResultStatus();// 判断resultStatus 为9000则代表支付成功if (TextUtils.equals(resultStatus, "9000")) {// 该笔订单是否真实支付成功,需要依赖服务端的异步通知。Toast.makeText(MainActivity.this, "支付成功", Toast.LENGTH_SHORT).show();UnityPlayer.UnitySendMessage("PayMar", "IpayCallback",Integer.toString(MainActivity.number));} else {// 该笔订单真实的支付结果,需要依赖服务端的异步通知。Toast.makeText(MainActivity.this, "支付失败", Toast.LENGTH_SHORT).show();}break;}default:break;}};

至此,APP端的主要内容完毕

下面介绍商户服务端,首先要配置相关参数,注意公钥和RSA2或者RSA要一一对应

服务器端接口支付APP端发来的请求并返回订单信息(先上图,再上代码)

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.err.println(request.getParameter("totalFee"));String  totalFee = request.getParameter("totalFee");// 实例化客户端AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID,APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2");// 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.payAlipayTradeAppPayRequest alipayrequest = new AlipayTradeAppPayRequest();// SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();model.setBody("商品描述");//商品描述model.setSubject("商品描述");//商品描述model.setOutTradeNo(getOutTradeNo());//订单号model.setTimeoutExpress("30m");//超时时间model.setTotalAmount(totalFee);//金额model.setProductCode("QUICK_MSECURITY_PAY");alipayrequest.setBizModel(model);alipayrequest.setNotifyUrl("http://xxx.com/AliPayNotify"); //异步通知地址try {// 这里和普通的接口调用不同,使用的是sdkExecuteAlipayTradeAppPayResponse alipayresponse = alipayClient.sdkExecute(alipayrequest);System.out.println(alipayresponse.getBody());// 就是orderString// 可以直接给客户端请求,无需再做处理。response.getWriter().append(alipayresponse.getBody()).append(request.getContextPath());} catch (AlipayApiException e) {e.printStackTrace();}}/*** 要求外部订单号必须唯一。** @return*/private static String getOutTradeNo() {SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());Date date = new Date();String key = format.format(date);Random r = new Random();key = key + r.nextInt();key = key.substring(0, 15);return key;}

当APP端支付成功后将会异步通知到服务端回调的接口

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 支付宝支付结束回调接口String result = "failure";// 获取支付宝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对应应用下查看。try {boolean flag = AlipaySignature.rsaCheckV1(params, alipaypublicKey, charset, "RSA2");if (flag) {// TODO 验签成功后System.out.println("=============================验签成功==============================");result = "success";response.getOutputStream().write(result.getBytes("utf-8"));// 指定编码为utf-8} else {System.out.println("=============================验签失败==============================");response.getOutputStream().write(result.getBytes("utf-8"));// 指定编码为utf-8}} catch (AlipayApiException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

最后再次提醒各位开发者容易出错的几个点:

1.沙箱测试时通过,而在项目APP里却不通过,很有可能是APP没有提交上线签约的缘故,或者是密钥和公钥未更改(或RSA,RSA2加密与公钥不对照的问题),以及初始化时候沙箱环境未取消
2.服务器订单验签时候服务端提示验签成功,但是官方提供的验签工具却提示失败,这个我也不太清楚原因,好多开发者朋友都反映过,建议大家以服务器端的验签结果为准
3.APP设置详情里支付宝的网关地址默认是空白的,这时候要改成https://openapi.alipay.com/gateway.do,否则会遇到即使客户端支付成功了,服务端也收不到异步通知的情况

APP接入支付宝支付完整流程及踩坑记录(含服务端)相关推荐

  1. 支付宝服务器响应时间,APP接入支付宝支付完整流程及踩坑记录(含服务端)

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, ...

  2. node 对接微信支付的踩坑记录(服务端)

    因项目需要,对接了微信支付,微信支付对于网页来说没有什么工作量,申请了商户号后,直接将收款码放到网页上就可以,但是小程序需要调起微信支付直接付款,于是认真翻阅了官网要针对小程序做微信支付的对接. 准备 ...

  3. APP接入支付宝支付申请流程

    打开蚂蚁金服平台地址:https://auth.alipay.com/,注册企业账号,角色通常为自研开发者 登录企业账号,进行企业信息认证 开发中心--网页&移动应用--支付接入,创建新的移动 ...

  4. SpringBoot集成支付宝沙箱手机网站支付详细流程和踩坑分享

    描述 本文主要讲解SpringBoot集成支付宝沙箱手机网站支付,即网页点击按钮发起支付,跳转到沙箱app付款 由于其他博客的流程大多笼统,有时候并不能找到正确的集成方式,本文尽可能详细的阐述付款,异 ...

  5. 博途v17与winCC安装流程与踩坑记录

    博途v17与winCC7.5安装教程与踩坑记录 安装教程 博途安装流程 第一步 注册表删除 第二步 启用.NET Framework服务 第三步 正式安装 winCC安装流程 博途v17与winCC安 ...

  6. Ubuntu20.0编译LineageOs14刷入小米8Lite(青春版)流程与踩坑记录

    本文全是个人经历与踩坑记录,不同机型配置可能不一样 全文踩坑内容错误加粗 编写时间:2022.5.24-14:53 机型配置: 虚拟机 4核心 每核心2线程 手机 小米8Lite 设备代号:plati ...

  7. APP接入支付宝支付之服务端实现

    最近公司接了一个外包项目,开发过程中用到了调用微信和支付宝的第三方支付接口,因为之前没用集成过,所以这次用到了之后就想总结一下分享给大家,这里只介绍支付宝的APP支付和提现接口的服务端接入实现. 首先 ...

  8. APP接入支付宝支付功能

    适用场景 在App内集成支付宝支付.APP调用支付宝提供的SDK,SDK再调用支付宝APP内的支付模块.如果用户已安装支付宝APP,商家APP会跳转到支付宝中完成支付,支付完后跳回到商家APP内.如果 ...

  9. APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现)

    前言 近期进行 Uniapp 的开发学习,最后阶段用到了 支付宝支付,相对移动应用的开发周期和专业复杂度,个人觉得这个前端框架还是很有可取之处的 本人在此记录一下,初涉此框架遇到的极有可能入坑的地方, ...

最新文章

  1. Python裁剪图片(Crop an Image)
  2. 观点 | 港科大张潼教授最新发言:对人工智能发展的一些思考
  3. 代码编程教学_少儿编程教学环境开发之代码实战篇
  4. Java 8类型注释
  5. JEECG Online开发教程专题视频-张代浩-专题视频课程
  6. 【JEEWX企业号专题】JEEWX与微信企业号对接,激活应用回调模式
  7. Win10 Ubuntu子系统用户密码忘记解决方案
  8. maven依赖冲突以及解决方法
  9. Eclipse远程部署
  10. Oracle 10g中UNDO数据的作用及UNDO表空间的操作详解
  11. 咖啡品牌“三顿半”完成千万级Pre-A轮融资,峰瑞资本投资...
  12. 【TWVRP】基于matlab粒子群算法求解带时间窗的车辆路径规划问题【含Matlab源码 334期】
  13. JavaWeb检测注册内容是否在数据库中有相同的内容
  14. 移动硬盘接口坏了怎么办解决教程
  15. 语音控制小车运动APP(基于百度语音识别)
  16. 从安卓巴士到CocoaChina,曾经的顶级流量王者,如今的落寞与淡去
  17. 推荐几本学习Go语言的书
  18. 计算机发展史谈VR技术,当计算机专业课与校史相遇 复旦学子打造VR校史馆
  19. python语音播报天气预报_python让生活更有趣--来个语音天气助手吧
  20. mysql切换Tidb

热门文章

  1. 爬取蝉妈妈数据平台商品数据
  2. shell脚本超时处理
  3. 人民日报点名大数据时代信息隐私安全
  4. 个体户没对公银行账号怎么开通微信支付?
  5. 软件测试——缺陷报告的编写
  6. 7 foundation plates(葫芦娃7兄弟)
  7. Unity3d脚本改变GameObject的Material(一)
  8. 从零开始的nrf52832蓝牙开发(4)--串口DFU
  9. 见人搭话:聊别人擅长或感兴趣的话题
  10. ICG-PEG-NHS,吲哚菁绿PEG活性酯,ICG-PEG2000-NHS