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

本实例是基于springBoot框架编写

一、流程步骤

1.执行流程

当手机端app在支付页面时,调起服务端创建订单(自己公司业务接口)接口,后台把需要调起支付宝支付的参数返回给手机端,手机端得到参数后,调起支付宝支付环境支付,完成支付后后会调异步通知接口,此时需要给支付宝返回成功或者失败信息,

返回支付成功页面,完成整个支付流程。

二、java后台开发

①,添加依赖,我的是最新的sdk

<!-- 支付宝支付 -->

<dependency>

  <groupId>com.alipay.sdk</groupId>

  <artifactId>alipay-sdk-java</artifactId>

  <version>3.7.26.ALL</version>

</dependency>

②支付宝基本配置 AlipayConfig


**

* 支付宝基础配置类

*/

public class AlipayConfig {

    // 1.商户appid

    public static String APPID = "20190.......";

    //2.私钥 pkcs8格式的

    public static String RSA_PRIVATE_KEY = "4HPo2O+dTYVyp2SNZ8xMpwJGBx/Y1hJu1f79GhRsx+9rEpFEiGoty1hMwo7NAXEXeLIP7GjaQQP95+AlizjfqtWil7x/c0vzHY+USn0BTM8Dg28jM6brSZ+k76miqw88uhnNZnenWvrYHRJQu3mm5Sp75CMyn5yZ4banhGxVdXucC2Qv23tYsJbwEPYaARiOAHXtVrsz8vZ0DmGrR2yHIqqmFOVzHsJdYaiiGsE0sKaq3g7LmlXrqdSCvgUaKORWPdCEaWO3hQYtaRoDA3Tmdqwo0cEJtr0rNTLKpt0LAgMBAAECggEAD0RzXDFt8Z6ITs83gsmkEbIYmnvdcXK81SS1gfupSzejGvyKj/oXyL1FCEH6/f2IABxHM5OW2dNTy9dh0HAprpJNGHOpMtfkfLr6M9DcpchGikwPHWMXezJl1+/xj3pThvJ8ZdOYIP8kp/HOSf16RH5i1IUe4N1hPJuWRBRj/+nJ3k7wbfJvG7SMWUOmuTi9iGaSwFBVKnirIubDMrbGjOXW8FU2xz6IWqkTWXiRWkhOhd6lUA21QqjikQxF3LsrmIRV3mieTYbjpmr71nTkh590bEnIBbDQQL10s433HbXTL5PVdYOBZU/j+FQewBbNTpMVDQ+f+tEKTk9MwMOuKQKBgQDqxAawGdLuX8rTJuskc9DcDY1CqXs+jydlgxKNttwIc8BipW00j0JC+y7n+Jw2XqDqS5RZk9qD0AUDdG0BC81H";

    // 3.支付宝公钥

    public static String ALIPAY_PUBLIC_KEY = "a6Hd6aeqN7mTAKoZcArHnwWjtaGok312sFyY0tNgXTeG9fVE/2X";

    // 4.服务器异步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问

    public static String notify_url = "http://xxx/appAlipay/notifyUrl";

    //5.页面跳转同步通知页面路径 需http://或者https://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 商户可以自定义同步跳转地址

    public static String return_url = "http://xxx/return_url.do";

    // 6.请求支付宝的网关地址

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

    // 7.编码

    public static String CHARSET = "UTF-8";

    // 8.返回格式

    public static String FORMAT = "json";

    // 9.加密类型

    public static String SIGNTYPE = "RSA2";

}


③支付核心


/**

* 支付宝app支付

*/

@RestController

@RequestMapping("/appAlipay")

public class AppAlipayController extends BaseController {


    /**

    * 统一下订单签名

    *

    * @param orderId 订单id

    * @return

    */

    @RequestMapping("/signParams")

    public ResultJson signParams(@RequestParam Long orderId) {

        logger.info("appAlipay/signParams");

        try {

          //自己的业务逻辑创建订单

              、、、、、、、、、

            //实例化客户端(参数:网关地址、商户appid、商户私钥、格式、编码、支付宝公钥、加密类型),为了取得预付订单信息

            AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.SIGNTYPE);

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

            AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();

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

            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();

            //业务参数传入,可以传很多,参考API

            //model.setPassbackParams(URLEncoder.encode(request.getBody().toString())); //公用参数(附加数据)

            model.setBody(body.toString());//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。

            model.setSubject(subject.toString());//商品名称

            model.setOutTradeNo(Long.toString(orderId));////商户订单号

            model.setTimeoutExpress("30m");//交易超时时间

            model.setTotalAmount("0.01");//支付总金额

            model.setProductCode("QUICK_MSECURITY_PAY");//销售产品码,商家和支付宝签约的产品码

            request.setBizModel(model);

            request.setNotifyUrl(AlipayConfig.notify_url);//异步回调地址(后台)

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

            AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);

            String orderString = response.getBody();//就是orderString 可以直接给客户端请求,无需再做处理。

            return successs(orderString);

        } catch (AlipayApiException e) {

            e.printStackTrace();

            return errorr(CodeMsg.PAY_FAIL);

        }

    }

}


④支付支付成功后,调用后台异步通知接口


/**

    * 异步通知处理

    *

    * @param request

    * @return

    */

    @RequestMapping(value = "notifyUrl", method = RequestMethod.POST)

    public String notify(HttpServletRequest request) {

        try {

            //获取支付宝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对应应用下查看。

            //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)

            boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, AlipayConfig.SIGNTYPE);

            //对验签进行处理

            if (signVerified) {  //验签通过

                if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {//只处理支付成功的订单: 修改交易表状态,支付成功

                    //业务处理

                    String out_trade_no = params.get("out_trade_no");            // 商户订单号


                    return "success"; //成功

                } else {//支付失败

                    return "fail";

                }

            } else {// 验证失败

                return "fail";

            }

        } catch (AlipayApiException e) {

            e.printStackTrace();

            return "fail";

        }

    }


三,到此支付支付完成。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容