一、前言

AliPay - Java支付宝接口开发(一)

AliPay - Java支付宝接口开发(二)

二、支付宝沙箱环境集成Web项目

1、将支付宝Demo中的相关文件复制到我们的项目中

1.1 Maven以外的Jar包(红框部分)(主要2个,还有2个是对应的源码)

1.2 Maven以内的Jar包(最好版本号都一样,以免出现意想不到的事)

<!-- alipay -->
<dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.10</version></dependency><dependency><groupId>commons-configuration</groupId><artifactId>commons-configuration</artifactId><version>1.10</version></dependency><dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>2.1</version></dependency><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.3.1</version></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId><version>1.3</version></dependency></dependencies>

1.3 上面是jar包的配置,接下来我们在pom.xml里面配置一个插件,使项目编译需要的jar在项目部署的时候自动将 lib 包里的Jar添加到项目依赖中

<!-- geelynote maven的核心插件之-complier插件默认只支持编译Java 1.4,因此需要加上支持高版本jre的配置,在pom.xml里面加上 增加编译插件 -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.7</source><target>1.7</target><encoding>UTF-8</encoding><compilerArguments><extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs></compilerArguments></configuration>
</plugin>

1.4 zhifubao.properties这个配置文件方法我们项目中的 resources目录下

# 支付宝网关名、partnerId和appId
open_api_domain = https://openapi.alipaydev.com/gateway.do
mcloud_api_domain = http://mcloudmonitor.com/gateway.do
pid = 2088102180444972
appid = 2016102100728313# RSA私钥、公钥和支付宝公钥
private_key = MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCKQ2pEIzXM4IoN1cMzOFXdlk8yVX2cKXWITZ92EGAQQcRytaV07yQOaz3UE9KTeT9Nu628G+HZMsJUxQjEUETagmY5nLtbeL35M2UcibYpM3e2gVTtUW86CA65GCdLzUhdIug8yf2F9zWayzG4sHZ9DcTezG6ZjFu+EtDpFgg+CtqY7n/ihjTIqeE1lX0C2ZIKpIYs7QjR8AztB/qRcpOJKRfMKGDgmT9GALN8LeFEYCbQ+W/GJHN8bQ0Bk1Ll6EKQ4cHXZ1Yko+aXaRfbXfUZYgD9hwAVlxtwZndgeFX8KapOCw0J25pzV4WkutIjMlt7I2Q1jaWNoKLuxtz4M2mzAgMBAAECggEAAhnsL4TpeGehMXyiLtEYXPm/0mACPLFUm/GyDrVJAHY/ag7gqNpJjf6LPgHfHWamU6Qai9VQpWBkG62y6Gjf4wJAU3fSUR2QpYzmaHyfTBkAJMHqbIDkU9lzf9SiJEDGbMPvC512QOb05ZlY9Bmac2QWLdylgafkbQsUKbawAWFa/BAOMIp0tgYLW8/yY2aG6jeLqhOgTo8MWIW5d1qHtX5m/x7g97dYYMdX3kTo2i1dFLUVfEOvZe4US6VBvLg71dMxwadVF5YMaY9jq/ShPD0Gkf29wdThwsjcH6u9Tq/KArQTK+z02DAGkdWOcue3pHql+gvoIA8U5uFDdIeYwQKBgQDri3jPkDKi48efdKQk38rn+CJYeNFNRAhlly3h2AHaFEY92XRlBsho/vGFg43BvHu+cMz0Run4SS8Vo09vcTIY6p2xNMffjR0w2gQqx6PUdGHBFtw7FavxN4uVtVhL6uTAqfBv97mqQO0bq+DhOGwSRNIWqvnzfXywqwmXhKYECwKBgQCWRTl6tNv8scxPq4fpRL/uw71TU6XqSS/nME7KT4uyQPAXPk0mXVVwdmyST9Crlr6O6WJopPe9nMIFUYdjdkLfGKLCR96AH3U7frr4jf60eDYEhfHGIzln/ptrTJLvvbXTaPctAaZd6TIv63QVz3yim4MMl3VSdRlrE+O9R5ZR+QKBgQDjEP8TyUSnNsJX+4/JZFwsp04kz8OlorIdjVHT5/JREz5rnVfRlGpanXqjZSCg5Vy9R+ysiDhA+/wB9f87xXmv/2ypSeJspZLAZ0uhGffbdZ5PEASaiNfKn+tWFQ3bkcOX37tDlSJM+G4bQOR2+XdlXSbSZ1yx2AT+IsQKZvvL5QKBgQCPZEUiEz0sV1kX2R2a+XCQ3RVnUxWqh+X/HPjCUr+B/DdeZqPl7QAfjdGymBkN842o/4lZQ7nnpJL70j14KpxLGM4Ox9fIuLv8ZsTxc0XOXjtle48nO+uGkc0qyWoY/RVpQ+tBdiaTzHeIhIxEV7adz/lwZYKdiYIUzGjv8ES/uQKBgCgeWysXjahCQItxx5fTrS8SQFP7Dx5vDW+UkqQ2pbL0AlHyUS7pWJj3AAe3pn4AJZZp4SZPoQP+Z8JPqDA6MrQWHYMi0XkMuMYwLWbGCkmf1MnjUxgOaLXoItjxS/y3jQfeOmHhmOAVkjnEvAh+BWlZxFMv2kiuHRU72bNa0rDI
public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAikNqRCM1zOCKDdXDMzhV3ZZPMlV9nCl1iE2fdhBgEEHEcrWldO8kDms91BPSk3k/TbutvBvh2TLCVMUIxFBE2oJmOZy7W3i9+TNlHIm2KTN3toFU7VFvOggOuRgnS81IXSLoPMn9hfc1mssxuLB2fQ3E3sxumYxbvhLQ6RYIPgramO5/4oY0yKnhNZV9AtmSCqSGLO0I0fAM7Qf6kXKTiSkXzChg4Jk/RgCzfC3hRGAm0PlvxiRzfG0NAZNS5ehCkOHB12dWJKPml2kX2131GWIA/YcAFZcbcGZ3YHhV/CmqTgsNCduac1eFpLrSIzJbeyNkNY2ljaCi7sbc+DNpswIDAQAB#SHA1withRsa对应支付宝公钥
#alipay_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB#SHA256withRsa对应支付宝公钥
alipay_public_key = MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqzWgVL/NWrJAeyEImwtaK3IDwj0dKkqUDIfqqWn5SiLaWMYi9RmKhn+jY9VM7JXEIkYYeVlqIL6Xn7OvYFRTi4buTCXGKvFLn95aDcaur77/S/0ibcdN1K2wIoHzaqQhXAb1ezKxTnFP7OLJsAL22b0NzrQDj2OH9SA06gJb8nHBfR+7Sx7DfwcqE0OtTcDHjbbcB24Qgg/dfItxoEnKuSyRVrf6BtpUnJxSzG/Ge7FfF+VBq8re1t4ZTSxaDEjto071I5VFBxr7I4SyqZsc7WpAmZL8AqUgEbQ1XYBWx2LnpJXM5GQW/thUvcDDqzea7LJNWJOQPM5DaZQgu7QuuwIDAQAB# 签名类型: RSA->SHA1withRsa,RSA2->SHA256withRsa
sign_type = RSA2# 当面付最大查询次数和查询间隔(毫秒)
max_query_retry = 5
query_duration = 5000# 当面付最大撤销次数和撤销间隔(毫秒)
max_cancel_retry = 3
cancel_duration = 2000# 交易保障线程第一次调度延迟和调度间隔(秒)
heartbeat_delay = 5
heartbeat_duration = 900

1.5 继而我们运行一下复制过来的Main.class,发现Demo是可以跑起来的~

2、编写支付接口

2.1 OrderController类

@Controller
@RequestMapping("/order/")
public class OrderController {private static final Logger logger = LoggerFactory.getLogger(OrderController.class);@RequestMapping("pay.do")@ResponseBodypublic ServerResponse pay(HttpSession session, Long orderNo, HttpServletRequest request){User user = (User)session.getAttribute(Const.CURRENT_USER);if(user == null){return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc());}String path = request.getSession().getServletContext().getRealPath("upload");return iOrderService.pay(orderNo,user.getId(),path);}@RequestMapping("alipay_callback.do")@ResponseBodypublic Object alipayCallback(HttpServletRequest request){// 回调函数,也就是在支付成功之后,可以调用我们支付之后需要执行的相关方法,从而达到数据库的数据和我们的操作相统一。Map<String,String> params = Maps.newHashMap();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]+",";}params.put(name,valueStr);}logger.info("支付宝回调,sign:{},trade_status:{},参数:{}",params.get("sign"),params.get("trade_status"),params.toString());// 非常重要,验证回调的正确性,是不是支付宝发的。并且呢还要避免重复通知。params.remove("sign_type"); // 因为支付宝要求我们除去两个参数 sign(rsaCheckV2函数已经帮我们除去)、sign_type(自己手动除去)try {// RSA2// 第二参数注意是支付宝公共密钥,而不是应用密钥// 这里编码是与 new AlipayTradeServiceImpl.ClientBuilder().build(); 里的编码一样,build() 默认为UTF-8,当然也可以自定义,但是只要保证两个一样即可,我们统一保持UTF-8boolean alipayRSACheckedV2 = AlipaySignature.rsaCheckV2(params, Configs.getAlipayPublicKey(),"utf-8",Configs.getSignType());if(!alipayRSACheckedV2){return ServerResponse.createByErrorMessage("非法请求,验证不通过,再恶意请求我就报警找网警了");}} catch (AlipayApiException e) {logger.error("支付宝验证回调异常",e);}/*  todo 验证各种数据第五步:需要严格按照如下描述校验通知数据的正确性。商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,并判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),同时需要校验通知中的seller_id(或者seller_email)是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),上述有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。*/ServerResponse serverResponse = iOrderService.aliCallback(params);if(serverResponse.isSuccess()){return Const.AlipayCallback.RESPONSE_SUCCESS;}return Const.AlipayCallback.RESPONSE_FAILED;}@RequestMapping("query_order_pay_status.do")@ResponseBodypublic ServerResponse<Boolean> queryOrderPayStatus(HttpSession session, Long orderNo){User user = (User)session.getAttribute(Const.CURRENT_USER);if(user ==null){return ServerResponse.createByErrorCodeMessage(ResponseCode.NEED_LOGIN.getCode(),ResponseCode.NEED_LOGIN.getDesc());}ServerResponse serverResponse = iOrderService.queryOrderPayStatus(user.getId(),orderNo);if(serverResponse.isSuccess()){return ServerResponse.createBySuccess(true);}return ServerResponse.createBySuccess(false);}
}

2.2 IOrderService接口类

package com.mmall.service;import com.github.pagehelper.PageInfo;
import com.mmall.common.ServerResponse;
import com.mmall.vo.OrderVo;
import java.util.Map;public interface IOrderService {ServerResponse pay(Long orderNo, Integer userId, String path);ServerResponse aliCallback(Map<String,String> params);ServerResponse queryOrderPayStatus(Integer userId,Long orderNo);
}

2.3 OrderServiceImpl实现类

package com.mmall.service.impl;import com.alipay.api.AlipayResponse;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.demo.trade.config.Configs;
import com.alipay.demo.trade.model.ExtendParams;
import com.alipay.demo.trade.model.GoodsDetail;
import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder;
import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult;
import com.alipay.demo.trade.service.AlipayTradeService;
import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl;
import com.alipay.demo.trade.utils.ZxingUtils;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mmall.common.Const;
import com.mmall.common.ServerResponse;
import com.mmall.dao.CartMapper;
import com.mmall.dao.OrderItemMapper;
import com.mmall.dao.OrderMapper;
import com.mmall.dao.PayInfoMapper;
import com.mmall.dao.ProductMapper;
import com.mmall.dao.ShippingMapper;
import com.mmall.pojo.Cart;
import com.mmall.pojo.Order;
import com.mmall.pojo.OrderItem;
import com.mmall.pojo.PayInfo;
import com.mmall.pojo.Product;
import com.mmall.pojo.Shipping;
import com.mmall.service.IOrderService;
import com.mmall.util.BigDecimalUtil;
import com.mmall.util.DateTimeUtil;
import com.mmall.util.FTPUtil;
import com.mmall.util.PropertiesUtil;
import com.mmall.vo.OrderItemVo;
import com.mmall.vo.OrderProductVo;
import com.mmall.vo.OrderVo;
import com.mmall.vo.ShippingVo;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;@Service("iOrderService")
public class OrderServiceImpl implements IOrderService {private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);private static  AlipayTradeService tradeService;static {/** 一定要在创建AlipayTradeService之前调用Configs.init()设置默认参数*  Configs会读取classpath下的zfbinfo.properties文件配置信息,如果找不到该文件则确认该文件是否在classpath目录*/Configs.init("zfbinfo.properties");/** 使用Configs提供的默认参数*  AlipayTradeService可以使用单例或者为静态成员对象,不需要反复new*/tradeService = new AlipayTradeServiceImpl.ClientBuilder().build();}@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate OrderItemMapper orderItemMapper;public ServerResponse pay(Long orderNo,Integer userId,String path){Map<String,String> resultMap = Maps.newHashMap();Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);if(order == null){return ServerResponse.createByErrorMessage("用户没有该订单");}resultMap.put("orderNo",String.valueOf(order.getOrderNo()));// (必填) 商户网站订单系统中唯一订单号,64个字符以内,只能包含字母、数字、下划线,// 需保证商户系统端不能重复,建议通过数据库sequence生成,String outTradeNo = order.getOrderNo().toString();// (必填) 订单标题,粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费”String subject = new StringBuilder().append("happymmall扫码支付,订单号:").append(outTradeNo).toString();// (必填) 订单总金额,单位为元,不能超过1亿元// 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】String totalAmount = order.getPayment().toString();// (可选) 订单不可打折金额,可以配合商家平台配置折扣活动,如果酒水不参与打折,则将对应金额填写至此字段// 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】String undiscountableAmount = "0";// 卖家支付宝账号ID,用于支持一个签约账号下支持打款到不同的收款账号,(打款到sellerId对应的支付宝账号)// 如果该字段为空,则默认为与支付宝签约的商户的PID,也就是appid对应的PIDString sellerId = "";// 订单描述,可以对交易或商品进行一个详细地描述,比如填写"购买商品2件共15.00元"String body = new StringBuilder().append("订单").append(outTradeNo).append("购买商品共").append(totalAmount).append("元").toString();// 商户操作员编号,添加此参数可以为商户操作员做销售统计String operatorId = "test_operator_id";// (必填) 商户门店编号,通过门店号和商家后台可以配置精准到门店的折扣信息,详询支付宝技术支持String storeId = "test_store_id";// 业务扩展参数,目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法),详情请咨询支付宝技术支持// 不要修改ExtendParams extendParams = new ExtendParams();extendParams.setSysServiceProviderId("2088100200300400500");// 支付超时,定义为120分钟String timeoutExpress = "120m";// 商品明细列表,需填写购买商品详细信息,List<GoodsDetail> goodsDetailList = new ArrayList<GoodsDetail>();// 添加需要购买的商品List<OrderItem> orderItemList = orderItemMapper.getByOrderNoUserId(orderNo,userId);for(OrderItem orderItem : orderItemList){GoodsDetail goods = GoodsDetail.newInstance(orderItem.getProductId().toString(), orderItem.getProductName(),BigDecimalUtil.mul(orderItem.getCurrentUnitPrice().doubleValue(),new Double(100).doubleValue()).longValue(),orderItem.getQuantity());goodsDetailList.add(goods);}// 创建扫码支付请求builder,设置请求参数AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder().setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo).setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body).setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams).setTimeoutExpress(timeoutExpress).setNotifyUrl(PropertiesUtil.getProperty("alipay.callback.url")) // 支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置.setGoodsDetailList(goodsDetailList);AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder);switch (result.getTradeStatus()) {case SUCCESS:logger.info("支付宝预下单成功: )");AlipayTradePrecreateResponse response = result.getResponse();dumpResponse(response);File folder = new File(path);if(!folder.exists()){folder.setWritable(true);folder.mkdirs();}// 生成支付二维码// 需要修改为运行机器上的路径// 细节细节细节,别忘了“/”String qrPath = String.format(path+"/qr-%s.png",response.getOutTradeNo());String qrFileName = String.format("qr-%s.png",response.getOutTradeNo());ZxingUtils.getQRCodeImge(response.getQrCode(), 256, qrPath);File targetFile = new File(path,qrFileName);try {FTPUtil.uploadFile(Lists.newArrayList(targetFile));} catch (IOException e) {logger.error("上传二维码异常",e);}logger.info("qrPath:" + qrPath);String qrUrl = PropertiesUtil.getProperty("ftp.server.http.prefix")+targetFile.getName();resultMap.put("qrUrl",qrUrl);return ServerResponse.createBySuccess(resultMap);case FAILED:logger.error("支付宝预下单失败!!!");return ServerResponse.createByErrorMessage("支付宝预下单失败!!!");case UNKNOWN:logger.error("系统异常,预下单状态未知!!!");return ServerResponse.createByErrorMessage("系统异常,预下单状态未知!!!");default:logger.error("不支持的交易状态,交易返回异常!!!");return ServerResponse.createByErrorMessage("不支持的交易状态,交易返回异常!!!");}}// 简单打印应答private void dumpResponse(AlipayResponse response) {if (response != null) {logger.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg()));if (StringUtils.isNotEmpty(response.getSubCode())) {logger.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(),response.getSubMsg()));}logger.info("body:" + response.getBody());}}// 回调函数public ServerResponse aliCallback(Map<String,String> params){Long orderNo = Long.parseLong(params.get("out_trade_no"));String tradeNo = params.get("trade_no");String tradeStatus = params.get("trade_status");Order order = orderMapper.selectByOrderNo(orderNo);if(order == null){return ServerResponse.createByErrorMessage("非快乐慕商城的订单,回调忽略");}if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){return ServerResponse.createBySuccess("支付宝重复调用");}if(Const.AlipayCallback.TRADE_STATUS_TRADE_SUCCESS.equals(tradeStatus)){order.setPaymentTime(DateTimeUtil.strToDate(params.get("gmt_payment")));order.setStatus(Const.OrderStatusEnum.PAID.getCode());orderMapper.updateByPrimaryKeySelective(order);}PayInfo payInfo = new PayInfo();payInfo.setUserId(order.getUserId());payInfo.setOrderNo(order.getOrderNo());payInfo.setPayPlatform(Const.PayPlatformEnum.ALIPAY.getCode());payInfo.setPlatformNumber(tradeNo);payInfo.setPlatformStatus(tradeStatus);payInfoMapper.insert(payInfo);return ServerResponse.createBySuccess();}// 查询订单支付状态public ServerResponse queryOrderPayStatus(Integer userId,Long orderNo){Order order = orderMapper.selectByUserIdAndOrderNo(userId,orderNo);if(order == null){return ServerResponse.createByErrorMessage("用户没有该订单");}if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){return ServerResponse.createBySuccess();}return ServerResponse.createByError();}
}

我们会发现,上面的大多数是直接从支付宝Demo中的Main类中复制过来的,我们只是更改了对应的参数。上面第四行代码我们用到了自己封装了一个根据订单号和用户Id来查询订单的方法。

2.4 *Mapper

//根据订单号和用户的Id来查询订单
Order selectByUserIdAndOrderNo(@Param("userId") Integer userId,@Param("orderNo") Long orderNo);//根据订单号来查询订单是否存在
Order selectByOrderNo(Long orderNo);

2.5 *Mapper.xml

<select id="selectByUserIdAndOrderNo" parameterType="map" resultMap="BaseResultMap">select<include refid="Base_Column_List"/>from mmall_orderwhere order_no = #{orderNo}and user_id = #{userId}
</select><select id="selectByOrderNo" resultMap="BaseResultMap" parameterType="long" >select<include refid="Base_Column_List"/>from mmall_orderwhere  order_no=#{orderNo}
</select>

2.6 Const类

public enum OrderStatusEnum{CANCELED(0,"已取消"),NO_PAY(10,"未支付"),PAID(20,"已付款"),SHIPPED(40,"已发货"),ORDER_SUCCESS(50,"订单完成"),ORDER_CLOSE(60,"订单关闭");OrderStatusEnum(int code,String value){this.code = code;this.value = value;}private String value;private int code;public String getValue() {return value;}public int getCode() {return code;}public static OrderStatusEnum codeOf(int code){for(OrderStatusEnum orderStatusEnum : values()){if(orderStatusEnum.getCode() == code){return orderStatusEnum;}}throw new RuntimeException("么有找到对应的枚举");}
}public interface  AlipayCallback{String TRADE_STATUS_WAIT_BUYER_PAY = "WAIT_BUYER_PAY";String TRADE_STATUS_TRADE_SUCCESS = "TRADE_SUCCESS";String RESPONSE_SUCCESS = "success";String RESPONSE_FAILED = "failed";
}public enum PayPlatformEnum{ALIPAY(1,"支付宝");PayPlatformEnum(int code,String value){this.code = code;this.value = value;}private String value;private int code;public String getValue() {return value;}public int getCode() {return code;}
}public enum PaymentTypeEnum{ONLINE_PAY(1,"在线支付");PaymentTypeEnum(int code,String value){this.code = code;this.value = value;}private String value;private int code;public String getValue() {return value;}public int getCode() {return code;}public static PaymentTypeEnum codeOf(int code){for(PaymentTypeEnum paymentTypeEnum : values()){if(paymentTypeEnum.getCode() == code){return paymentTypeEnum;}}throw new RuntimeException("么有找到对应的枚举");}
}

3、支付接口测试(一)

打开地址,显示二维码。

4、支付接口测试(二)

给沙箱环境配置我们的回调地址。

打开沙箱环境:登录 - 支付宝

在图上所示配置我们的回调地址。

由于我们是在本地开发,所以需要将本地IP映射到公网,这个教程有讲怎么将本地IP映射到公网:https://blog.csdn.net/czjlghndcy/article/details/81130029

映射好公网IP之后,我们就将对应生成的共网IP以及定义的接口访问地址粘贴到沙箱环境中的回调地址中即可~

支付一个未支付的案例

对生成的二维码进行支付

查询订单状态

显示已支付,So,我们的回调接口以及订单状态查询接口测试成功啦~

AliPay - Java支付宝接口开发(三)相关推荐

  1. java 支付宝接口开发_JAVA 实现支付宝接口

    0.必备类 AlipayConfig配置文件 (签约账号.密钥.页面跳转通知页面都在这里设定) MD5支付宝签名加密文件 AlipayCore支付宝接口公共函数类 AlipayNotify-支付宝通知 ...

  2. php集成支付宝接口,支付宝接口开发集成支付环境小结

    支付宝接口开发集成支付环境小结 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  支付宝接口开发集成支付环境小结.txt ] (友情提示:右键点上行txt文档名-&g ...

  3. 亚马逊电商数据自动化管理接口平台JAVA SP-API接口开发(中)

    亚马逊电商数据自动化管理接口平台JAVA SP-API接口开发(中) 重要说明 本文章为亚马逊系列其中的一篇,具体详见 主页 中亚马逊分类 该系列项目均为[CSDN轻夏]原创,未经允许禁止转载 如有疑 ...

  4. 分享一个JAVA专业接口开发利器,牛牛牛新鲜出炉!!!

    分享一个JAVA专业接口开发利器,集成在线接口文档 Swagger-ui,采用Jwt Token验证机制,最牛在于业务restful接口代码自动生成,更更牛的在接口可以做细化权限控制(例如:不同开发商 ...

  5. 亚马逊电商数据自动化管理接口平台JAVA SP-API接口开发(下)

    亚马逊电商数据自动化管理接口平台JAVA SP-API接口开发(下) 重要说明 本文章为亚马逊系列其中的一篇,具体详见 主页 中亚马逊分类 该系列项目均为[CSDN轻夏]原创,未经允许禁止转载 如有疑 ...

  6. java servlet接口开发_servlet三种实现方式之一实现servlet接口

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第一种示例代码如下(已去掉包名): import ...

  7. 基于SpringBoot+Vue开发的前后端分离博客项目-Java后端接口开发

    文章目录 1. 前言 2. 新建Springboot项目 3. 整合mybatis plus 第一步:导依赖 第二步:写配置文件 第三步:mapper扫描+分页插件 第四步:代码生成配置 第五步:执行 ...

  8. java 模板接口开发_微信公众平台 发送模板消息(Java接口开发)

    前言:最近一直再弄微信扫码推送图文消息和模板消息发送,感觉学习到了不少东西.今天先总结一下微信公众平台模板消息的发送.因为这个自己弄了很久,开始很多地方不明白,所以今天好好总结一下. 微信公众平台技术 ...

  9. java支付接口开发原理_java对接微信支付接口开发的过程是什么?

    java对接微信支付接口开发的过程是什么?以下是小编整理的java对接微信支付接口实现的方法和过程,有需要的朋友可以学习以下的java对接微信支付接口内容. java对接微信支付接口开发的过程是什么? ...

最新文章

  1. php request order,php.ini中的request_order推荐设置,requestorder_PHP教程
  2. intellij 快捷键_IntelliJ中的键盘快捷键
  3. word模板生成word报表文档
  4. 选防晒霜 要看四个要点 - 健康程序员,至尚生活!
  5. [fzu 2273]判断两个三角形的位置关系
  6. Activity之间传递参数
  7. 苹果手机解压缩软件_装X教科书:买苹果电脑前应该了解哪些东西?
  8. [Python] L1-036. A乘以B 团体程序设计天梯赛GPLT
  9. L1-022. 奇偶分家-PAT团体程序设计天梯赛GPLT
  10. bzoj 1263: [SCOI2006]整数划分
  11. Zookeeper C API 指南七(Zookeeper 辅助 API 介绍)
  12. 剖析HotSpot的Launcher
  13. lol服务器维护2021,英雄联盟客户端清理:2021进度与后续计划
  14. 中文图片验证码程序。
  15. 用js如何实现获取验证码
  16. Xcode8 解决控制台输出
  17. 心理咨询类_微信小程序项目实战、含:标注图、效果图、视频、源码
  18. PMP系列 - 关键链法
  19. Linux常用工具的使用
  20. ps制作食品网页总结

热门文章

  1. 费诺编码的MATLAB递归实现
  2. Android:代码混淆反混淆
  3. Python Day8 字符串练习
  4. 电信运营商工程项目管理
  5. 综述:Reading, writing and erasing mRNA methylation
  6. 聚力赋能·共享共创|吉鼎科技与厦门6大高校“敏捷开发教学研讨会”圆满成功!
  7. 利用文件时间批量重命名照片和视频
  8. 李宏毅(2020)作业10:异常检测(Anomaly Detection)
  9. 常见网页悬浮广告(JavaScript)
  10. python爬虫之常见的加密方式