文档章节

支付宝app支付

守望者之父
 守望者之父
发布于 2016/01/01 00:41
字数 741
阅读 44
收藏 2

支付宝接口要实现服务端和客户端(app)两部分,相比较微信而言支付宝接口流程没那么复杂。主要两部

(1)客户端从后台请求要支付对象的订单号、价格、回调url和相关key等信息。

(2)客户端调用支付宝api发起支付请求到支付宝平台。

(3)成功后支付宝调用回调url返回支付状态,服务器处理。处理包括校验、状态检查等。

后台主要代码:

首先获取订单号和账号key等给客户端。

/*
     * 阿里支付
     */
    @RequestMapping(value = "/user/payAliActivity", method = RequestMethod.POST, produces = { "application/json;charset=utf-8" })
    @ResponseBody
    public String payAliActivity(String activityId, double price, String userId) { 

         AliPayInfo info = new AliPayInfo();
            info.orderId = orderId;
            info.price = String.valueOf(price);
            info.title = act.title;   
            return gson.toJson(new ReturnObject(new ReturnBase(0, "成功"), info));     
    }

public class AliPayInfo {
    public String  orderId= "";//订单号
    public String price;//价格
    public String title;
    public String body;   
    public String notify_url="http://xxxx/alipaycallback";//回调地址

    public   String PARTNER = "20881xxx0028";
    public   String SELLER = "3xxx9@qq.com";
    public   String RSA_PRIVATE = "MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAPJuaim5e2Pwv5sW\n" +
            "vGrJXE/fvgfNoiukW6+6GiGFJeAmPrftGU7e65qdP9UgQUmxjj/bZ9uwMmuFGfTV\n" +
            "fx/4vv2UjpdHkRASlNochoEkp5aZub3yaZfndgV0qPQvpnwFbtd0thie2wb9kkXE\n" +
            "8ObRa0mSvXeDT0tWnR9oxVmNOUgZAgMBAAECgYEAzeb1iAafRBy/wAspcFEhdD2F\n" +
            "+r6uE/7+WFvpwbqClsQk1LYtno068hDInE1O5jZFqPrCVRZrXGKpzwZdeFweaT5H\n" +
            "C2kXPQjUGCwVOCU+KejipBdoBjIFumv9o4Tqwx+RW8RO8C6lUkRgdGuiui8pVRqy\n" +
         ;
    public   String RSA_PUBLIC = "MIGfMA0GCSqGSIb3DQE2qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB";
  
}


最后给出回调处理url:

@RequestMapping(value = "/alipaycallback", method = { RequestMethod.POST,
            RequestMethod.GET }, produces = { "application/json;charset=utf-8" })
    public String alipaycallback(HttpServletRequest request,
            HttpServletResponse response) {
        try {
            response.setCharacterEncoding("UTF-8");
            String logStr = "";
            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] + ",";
                }
                logStr += name + ":" + valueStr + ";";
                // 乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
                // valueStr = new String(valueStr.getBytes("ISO-8859-1"),
                // "gbk");
                params.put(name, valueStr);
            }

            // 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
            // 商户订单号

            String out_trade_no = new String(request.getParameter(
                    "out_trade_no").getBytes("ISO-8859-1"), "GBK");

            // 支付宝交易号

            String trade_no = new String(request.getParameter("trade_no")
                    .getBytes("ISO-8859-1"), "GBK");

            // 交易状态
            String trade_status = new String(request.getParameter(
                    "trade_status").getBytes("ISO-8859-1"), "GBK");

            // 获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

            // ////////////////////////////////////////////////////////////////////////////////////////
            // 请在这里加上商户的业务逻辑程序代码

            // ——请根据您的业务逻辑来编写程序(以下代码仅作参考)——

            if (trade_status.equals("TRADE_FINISHED")
                    || trade_status.equals("TRADE_SUCCESS")) {
           
                // 判断该笔订单是否在商户网站中已经做过处理
                // 如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                // 请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的
                // 如果有做过处理,不执行商户的业务程序
               MyPayedProcess(out_trade_no);
                PrintWriter out = response.getWriter();
                out.print("success");
                out.close();
                // 注意:
                // 退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
            }  else {
                PrintWriter out = response.getWriter();
                out.print("fail");
                out.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "success";
    }


© 著作权归作者所有

守望者之父
粉丝 4
博文 79
码字总数 48238
作品 0
南京
私信 提问
加载中

评论(1)

1992xuxiang
1992xuxiang
回调的时候没有做验证签名操作?
iOS小笔记 | 集成支付宝SDK总结

最近做的这个外包APP用到了支付宝,这里记录一下。 我看网上很多吐槽支付宝SDK的,不知道是不是以前集成支付宝太麻烦,反正现在集成支付宝就四个字:极其简单,集成过程中也没遇到坑什么的。...

无夜之星辰
05/02
0
0
支付宝---手机APP支付

手机APP支付总结: 一. 支付宝手机APP支付: 支付宝手机APP文档: https://doc.open.alipay.com/docs/doc.htm?treeId=204&articleId=105051&docType=1 首先先了解支付宝官方提供的官方文档, 说明...

噼里啪啦啦
2017/04/17
0
0
PHP 集成支付 SDK - PaySDK

PaySDK PaySDK 是 PHP 集成支付 SDK ,集成了支付宝、微信支付的支付接口和其它相关接口的操作。可以轻松嵌入支持 PHP >= 5.4 的任何系统中。 支持的支付平台 支付宝 即时到账 当面付 手机网...

宇润
2017/10/12
0
6
集成支付宝手机支付SDK for iOS

支付宝SDK付款有两种模式:如果外部存在支付宝钱包,则直接跳转到支付宝钱包付款;不存在的场景下,在SDK内部进行H5支付。 1. 数据交互流程 支付宝支付的业务数据交互流程图如下。 图 1 支付...

goodlook
2016/03/28
242
0
支付接口教程,详解支付宝接口(二)

支付宝的接口向来集成过程都让人觉得比较舒服,只有APP支付相对复杂,但也只是配置上复杂一些,只要清楚原理相信也不是什么难事。下面是以前介绍双钥加密原理的传送门: 支付接口教程特别篇,...

fourn
2017/07/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

聊聊中国的通信行业:从“七国八制”到“中华”脊梁

本期文章和大家一起来聊一聊我曾经从事过的通信行业吧。最近各方面信息的泛滥,包括和华为的同学聊天,自己确实也感慨颇多。想想我自己本科主修通信工程,研究生再修信息与通信工程,从本科开...

CodeSheep
49分钟前
3
0
MDK:ARM M451M:exceed the range of code meory, continue to erase or not?

问题: 代码空间超限 几天前就遇到:exceed the range of code meory, continue to erase or not? 如下所示: 解决过程 开始以为中MDK软件的128KB限制,如是就不能生成HEX文件,应该链接时有提...

SamXIAO
56分钟前
1
1
OSChina 周六乱弹 —— 因违反《中华人民共和国治安管理处罚法》第四十四条之规定

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :#今日歌曲推荐# 惊艳分享谷微的单曲《安守本份》(@网易云音乐) 《安守本份》- 谷微 手机党少年们想听歌,请使劲儿戳(这里) ...

小小编辑
今天
266
7
Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
8
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部