文档章节

App 集成支付宝支付接口(三)Java服务器端配置

fengzhi714
 fengzhi714
发布于 2016/12/08 17:40
字数 1086
阅读 1282
收藏 2
点赞 1
评论 7

官方文档

移动支付:

https://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1

app支付

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.4qQzLr&treeId=204&articleId=105051&docType=1

服务端,app支付demo中还没有,所以参考移动支付。

app支付是移动支付的升级版,配置方面也有一点点区别,我刚使用,所以就摈弃掉老版本了,如果各位看官有兴趣可以自己去捣鼓一下。

解压“WS_MOBILE_PAY_SDK_BASE_1.0.zip”,进入Java 服务器目录。

你可以用eclipse直接导入项目,也可以复制相关文件到自己已经创建好的项目中。(我是将文件复制到已经存在的项目中)

然后需要修改alipayconfig类中的参数,支付宝里面使用到的一些不会变化的参数也可以添加到这个类里面来。

package org.fengzhi.server.alipay.config;

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *版本:1.0
 *日期:2016-06-06
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {
//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    //合作身份者ID,签约账号,以2088开头由16位纯数字组成的字符串,查看地址:https://openhome.alipay.com/platform/keyManage.htm?keyType=partner
    public static String partner = "2088******704";

    //商户的私钥,需要PKCS8格式,RSA公私钥生成:https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.nBDxfy&treeId=58&articleId=103242&docType=1
    public static String private_key = "QcXe**********************************nKlU1OEbG3L";

    //支付宝的公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm?keyType=partner
    public static String alipay_public_key = "MIGfMA0****************i3eof7TcZ32oWpwIDAQAB";

    // 签名方式
    public static String sign_type = "RSA";
    // 调试用,创建TXT日志文件夹路径,见AlipayCore.java类中的logResult(String sWord)打印方法。
    public static String log_path = "d://alipay//";
    // 字符编码格式 目前支持 gbk 或 utf-8
    public static String input_charset = "utf-8";
    // 接收通知的接口名
    public static String service = "http://www.alipay.com/pay/verifySign.html";
    public static String app_id = "2016********71";
    // 商家唯一标识,自己随意填写。
    public static String target_id = "alipay************";

//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
}

客户端获取签名数据和支付宝异步通知

import com.alipay.api.internal.util.AlipaySignature;
import org.fengzhi.server.alipay.config.AlipayConfig;
import org.fengzhi.server.alipay.service.IAlipayService;
import org.fengzhi.server.alipay.util.AlipayNotify;
import org.fengzhi.server.alipay.util.OrderInfoUtil2_0;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.logging.Logger;

@Controller
@RequestMapping(value = "/pay", produces = "text/html, charset=utf-8")
public class AlipayNotifyController {

    public Logger log = Logger.getLogger(getClass().getName());

    @Autowired
    public IAlipayService alipayService;


    @ResponseBody
    @RequestMapping(value = "/getOrderInfo", method = RequestMethod.GET)
    public String getOrderInfo(String body, String subject, String outTradeNo, String totalAmount) throws Exception {
        // 请求参数拼接
        Map<String, String> publicData = OrderInfoUtil2_0.buildOrderParamMap(body, subject, outTradeNo, totalAmount);
        // 对参数进行签名
        String sign = OrderInfoUtil2_0.getSign(publicData, AlipayConfig.private_key);
        //
        String orderParam = OrderInfoUtil2_0.buildOrderParam(publicData);
        final String orderInfo = orderParam + "&" + sign;

        return orderInfo;
    }


    @RequestMapping(value = "/verifySign", method = RequestMethod.POST)
    public void verifySign(HttpServletRequest request, HttpServletResponse response) throws Exception {
        PrintWriter out = response.getWriter();

        //获取支付宝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] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
            //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "UTF-8");
            params.put(name, valueStr);
        }

        //异步通知ID
        String notify_id = request.getParameter("notify_id");

        //判断接受的post通知中有无notify_id,如果有则是异步通知。
        if (notify_id != null && notify_id != "") {
            //判断成功之后使用getResponse方法判断是否是支付宝发来的异步通知。
            if (AlipayNotify.verifyResponse(notify_id).equals("true")) {

                // 调用sdk验证签名
                boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.input_charset);

                if (signVerified) {
                    log.info("验签成功!");

                    //商户订单号
                    String outTradeo = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
                    // 总金额
                    double totalAmount = new Double(new String(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8"));
                    // 商家id
                    String sellerId = new String(request.getParameter("seller_id").getBytes("ISO-8859-1"), "UTF-8");
                    // 应用id
                    String appId = new String(request.getParameter("app_id").getBytes("ISO-8859-1"), "UTF-8");

                    //验证业务内容是否正确
                    boolean businessVerified = alipayService.verifyBusinessData(outTradeo, totalAmount, sellerId, appId);

                    if (businessVerified) {
                        //交易状态
                        String tradeStatus = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");

                        if (tradeStatus.equals("TRADE_SUCCESS")) {
                            // 支付成功处理方式

                            // 更新商户系统中用户交易订单信息等等。。。

                            out.print("success");
                        } else {
                            // 支付失败处理方式

                            out.print("failure");
                        }
                    }
                }
            } else {
                log.info("验证是否来自支付宝的通知失败!");
            }
        }

    }
}

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
fengzhi714
粉丝 5
博文 44
码字总数 14298
作品 0
佛山
后端工程师
加载中

评论(7)

idoy
idoy

引用来自“fengzhi714”的评论

引用来自“idoy”的评论

引用来自“idoy”的评论

我想问一下,现在公司叫我写一个java服务器端处理安卓客户端的接口,该怎么下手啊,完全没思路,可以按你这个写吗?还是说还差一些东西

引用来自“fengzhi714”的评论

服务端支付宝验证就这些了,当然具体交易更新我没写,你要集成进去的话根据你自己的逻辑去更新服务端的更新状态咯。客户端是支付宝自己返回状态的,你只要负责接收就可以了。还有就是密钥签名这些你要先弄,现在支付宝2.0,支持沙箱测试了,你下个2.0玩玩再集成进去也行。
你的源码还在吗?能不能发一份给我

回复@idoy : https://git.oschina.net/fengzhi714/alipayServer.git 你看下能不能访问
嗯嗯额,下载了!谢谢
fengzhi714
fengzhi714

引用来自“idoy”的评论

引用来自“idoy”的评论

我想问一下,现在公司叫我写一个java服务器端处理安卓客户端的接口,该怎么下手啊,完全没思路,可以按你这个写吗?还是说还差一些东西

引用来自“fengzhi714”的评论

服务端支付宝验证就这些了,当然具体交易更新我没写,你要集成进去的话根据你自己的逻辑去更新服务端的更新状态咯。客户端是支付宝自己返回状态的,你只要负责接收就可以了。还有就是密钥签名这些你要先弄,现在支付宝2.0,支持沙箱测试了,你下个2.0玩玩再集成进去也行。
你的源码还在吗?能不能发一份给我

回复@idoy : https://git.oschina.net/fengzhi714/alipayServer.git 你看下能不能访问
idoy
idoy

引用来自“idoy”的评论

我想问一下,现在公司叫我写一个java服务器端处理安卓客户端的接口,该怎么下手啊,完全没思路,可以按你这个写吗?还是说还差一些东西

引用来自“fengzhi714”的评论

服务端支付宝验证就这些了,当然具体交易更新我没写,你要集成进去的话根据你自己的逻辑去更新服务端的更新状态咯。客户端是支付宝自己返回状态的,你只要负责接收就可以了。还有就是密钥签名这些你要先弄,现在支付宝2.0,支持沙箱测试了,你下个2.0玩玩再集成进去也行。
你的源码还在吗?能不能发一份给我
fengzhi714
fengzhi714

引用来自“idoy”的评论

我想问一下,现在公司叫我写一个java服务器端处理安卓客户端的接口,该怎么下手啊,完全没思路,可以按你这个写吗?还是说还差一些东西

引用来自“fengzhi714”的评论

服务端支付宝验证就这些了,当然具体交易更新我没写,你要集成进去的话根据你自己的逻辑去更新服务端的更新状态咯。客户端是支付宝自己返回状态的,你只要负责接收就可以了。还有就是密钥签名这些你要先弄,现在支付宝2.0,支持沙箱测试了,你下个2.0玩玩再集成进去也行。

引用来自“idoy”的评论

不是要在服务端生成订单、签名等等吗,然后在返回给客户端
获取商品信息就是(getOrderInfo),也要根据你业务逻辑修改一下的。
idoy
idoy

引用来自“idoy”的评论

我想问一下,现在公司叫我写一个java服务器端处理安卓客户端的接口,该怎么下手啊,完全没思路,可以按你这个写吗?还是说还差一些东西

引用来自“fengzhi714”的评论

服务端支付宝验证就这些了,当然具体交易更新我没写,你要集成进去的话根据你自己的逻辑去更新服务端的更新状态咯。客户端是支付宝自己返回状态的,你只要负责接收就可以了。还有就是密钥签名这些你要先弄,现在支付宝2.0,支持沙箱测试了,你下个2.0玩玩再集成进去也行。
不是要在服务端生成订单、签名等等吗,然后在返回给客户端
fengzhi714
fengzhi714

引用来自“idoy”的评论

我想问一下,现在公司叫我写一个java服务器端处理安卓客户端的接口,该怎么下手啊,完全没思路,可以按你这个写吗?还是说还差一些东西
服务端支付宝验证就这些了,当然具体交易更新我没写,你要集成进去的话根据你自己的逻辑去更新服务端的更新状态咯。客户端是支付宝自己返回状态的,你只要负责接收就可以了。还有就是密钥签名这些你要先弄,现在支付宝2.0,支持沙箱测试了,你下个2.0玩玩再集成进去也行。
idoy
idoy
我想问一下,现在公司叫我写一个java服务器端处理安卓客户端的接口,该怎么下手啊,完全没思路,可以按你这个写吗?还是说还差一些东西
轻量级支付整合轻松嵌入任何系统 - pay-java-parent

轻量级支付模块集成(微信支付,友店扫码,支付宝,富友,银联, payoneer皮卡 )支付整合,app,扫码,即时到帐刷卡付条码付、支持多种支付类型多支付账户,支付与业务完全剥离,简单几行代码即可实...

egzosn ⋅ 2017/02/17 ⋅ 8

RMI:Java中的分布式计算框架

RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体现在它强大的开发分布式网络应用的能力上,是纯Java的网络分布式应用系统的核心解决方案之一。其实...

qq_39521554 ⋅ 05/15 ⋅ 0

Java就业变难了?你需要对自己有点信心

伴随着IT的火热,越来越多的人进入了IT领域,这在进一步推动着IT发展的同时也极大增加了就业压力。伴随着激烈的岗位竞争,越来越多的人开始感叹工作难找,越火的行业越是如此,Java自是首当其...

糖宝_d864 ⋅ 06/08 ⋅ 0

RPC框架实践之:Apache Thrift

一、概述 RPC(Remote Procedure Call)即 远程过程调用,说的这么抽象,其实简化理解就是一个节点如何请求另一节点所提供的服务。在文章 微服务调用链追踪中心搭建 一文中模拟出来的调用链:...

CodeSheep ⋅ 05/14 ⋅ 0

Spring Boot实践--集成WebServices基础开发

Spring Boot实践--集成Web Services基础开发 Spring Web Services(下简称ws)本质上是基于SpringBoot的项目,因此如果有对SpringBoot不太了解的同学,回头再来看比较合适。 ws分为server端与c...

spinachgit ⋅ 02/01 ⋅ 0

开源 | Eggjs 和 SOFA 的跨语言互调

SOFARPC 是近期蚂蚁金服开源的一个高可扩展性、高性能、生产级的 Java RPC 框架。在蚂蚁金服 SOFARPC 已经经历了十多年及五代版本的发展。SOFARPC 致力于简化应用之间的 RPC 调用,为应用提供...

花肉酱 ⋅ 06/14 ⋅ 0

【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 昨天 ⋅ 0

Gradle学习(九)——构建环境

转载请注明出处:http://blog.csdn.net/lastsweetop/article/details/78914742 通过gradle.properties配置构建环境 为了更容易的配置用于构建的java进程,Gradle提供了几个选项。你可以在本地...

lastsweetop ⋅ 2017/12/27 ⋅ 0

SpringBoot 整合 oauth2(三)实现 token 认证

关于session和token的使用,网上争议一直很大。 总的来说争议在这里: session是空间换时间,而token是时间换空间。session占用空间,但是可以管理过期时间,token管理部了过期时间,但是不占...

FantJ ⋅ 05/14 ⋅ 0

【J2EE】之常用的接口和协议

前言 初接触J2EE,会遇到很多之前没有遇到过的术语,下面我们来简单地汇总一下这些接口和协议吧。 各大接口和协议详解 JDBC 1.定义:Java数据库连接 2.地位:用于Java应用程序连接数据库的标...

m18633778874 ⋅ 04/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从 Confluence 5.3 及其早期版本中恢复空间

如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话。你可以使用临时的 Confluence 空间安装,然后将这个 Confluence 安装实例升级到你现...

honeymose ⋅ 今天 ⋅ 0

Java8新增的DateTimeFormatter与SimpleDateFormat的区别

两者最大的区别是,Java8的DateTimeFormatter也是线程安全的,而SimpleDateFormat并不是线程安全。 在并发环境下使用SimpleDateFormat 为了能够在多线程环境下使用SimpleDateFormat,有这三种...

人觉非常君 ⋅ 今天 ⋅ 0

多线程如何控制执行顺序

线程的生命周期说明: 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态,在线程的生命周期中,它要经过新建(New)、就绪(Runnable)、运行(Running)、...

MarinJ_Shao ⋅ 今天 ⋅ 0

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Django第一期

安装Django 去https://www.djangoproject.com/download/ 下载最新版的Django,然后解压放到Anaconda\Lib\site-packages目录下,然后cmd进入此目录,输入安装命令: python setup.py install ...

大不了敲一辈子代码 ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部