“优捷知付”正式与“3W创业服务平台”成为合作伙伴!

简介

本SDK是优捷API开发的JAVA版SDK,作为开发者调用优捷API的示例或者直接用于生产。

使用准备

1、下载Java版本SDK并导入到自己的工程依赖包中

2、注册优捷成为优捷的用户

3、创建应用

4、初始化支付对象,appId和appSecret从应用信息中获取

PayService payService = new PayService(appId, appSecret);

使用方法

• 支付

支付接口接收的参数为PayParams对象,该对象封装了发起支付接口的各个具体参数。参数描述如下:

参数名称 类型 是否必填 描述
channel enum 渠道类型:
WX_NATIVE 微信公众号二维码支付
WX_JSAPI 微信公众号支付
ALI_WEB 支付宝网页支付
ALI_WAP 支付宝移动网页支付
UP_WEB 银联网页支付
UP_WAP 银联移动支付
WX_APP 微信APP
ALI_APP 支付宝APP
orderAmt Integer 订单总金额, 只能为整数,单位为分
orderNo String 商户订单号, 32个字符内,数字和字母组合,确保在商户系统中唯一
title String 订单标题
returnUrl String 同步返回页面 , 支付渠道处理完请求后,当前页面自动跳转到商户网站里指定页面的http路径。
openId String 微信公众号支付(WX_JSAPI)必填
showUrl String 商品展示地址,需以http://开头的完整路径
qrModel enum 二维码模式
orderTime String 订单日期,日期格式为yyyy-MM-dd HH:mm:ss
customerId String 下单用户id
optional Map 附加数据, 用户自定义的参数,将会回调中原样返回,该字段主要用于商户携带订单的自定义数据

返回参数为ResponseParams对象,该对象包含了两部分内容,一部分为公共参数(主要包含:响应码、响应内容、签名信息、时间戳),一部分为业务返回参数,业务参数内容详见各个业务参数说明。

支付返回业务参数说明如下:

参数名称 类型 是否必填 描述
respCode String 响应码:000000:为成功,其他均为失败,详见错误码描述
respMsg String 响应内容
sign String 签名信息
timestamp String 时间戳
param PayResult 当响应码为成功时必填
param.codeUrl String 微信扫码支付二维码URL
param.html String 响应的html内容,开发者只要将HTML输出即可,渠道类型为:ALI_WEB、ALI_WAP、UP_WEB、UP_WAP时必填
param.wxJSAPIMap String 微信公众号支付js参数,渠道类型为WX_JSAPI必填
param.aliQrCode String 阿里扫码支付二维码,渠道类型为ALI_QRCODE必填
param.url String 备用
param.optional Map 请求是的option

代码示例

PayService payService = new PayService(appId, appSecret);
PayParams payParams = new PayParams();
payParams.setChannel(ChannelType.valueOf(request.getParameter("channel")));
payParams.setOpenId(request.getParameter("openId"));
payParams.setOrderAmt(Integer.parseInt(request.getParameter("orderAmt")));
payParams.setOrderNo(DateUtil.getCurrentDateTime());
payParams.setQrModel(QRModel.MODE_BRIEF_FRONT);
payParams.setReturnUrl(request.getParameter("returnUrl"));
payParams.setShowUrl(request.getParameter("showUrl"));
payParams.setTitle(request.getParameter("title"));
payParams.setOrderTime(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
Map optional = new HashMap();
optional.put("xxxx", "11111");
optional.put("aa", "11111");
optional.put("a1", "222");
optional.put("ab", "33");
optional.put("bb", "11111");
payParams.setOptional(optional);
ResponseParams responseParams = payService.pay(payParams);
boolean isVerify = payService.verifyResponseSign(responseParams);
if (isVerify) {
PayResult payResult = (PayResult) responseParams.getParam();
if ("000000".equals(responseParams.getRespCode())) {
//返回成功处理
if (payParams.getChannel().equals(ChannelType.WX_NATIVE)) {
request.setAttribute("codeUrl", payResult.getCodeUrl());
//若是微信扫码支付的话,则将二维码内容返回到指定的页面输出二维码
request.getRequestDispatcher("wxcode.jsp").forward(request, response);
} else {
os = response.getOutputStream();
os.write(payResult.getHtml().getBytes("UTF-8"));
}
} else {
//验签成功,返回错误码处理
}
}else{
//验签失败处理
}

• 退款

退款接口接收的参数为RefundParams对象,该对象封装了发起退款接口的各个具体参数。参数描述如下:

参数名称 类型 是否必填 描述
orderNo String 原订单
refundNo String 退款流水号
refundAmt Integer 退款金额, 只能为整数,单位为分
refundReason String 退款原因
optional Map 附加数据, 用户自定义的参数,将会回调中原样返回,该字段主要用于商户携带订单的自定义数据

返回参数为ResponseParams对象,该对象包含了两部分内容,一部分为公共参数(主要包含:响应码、响应内容、签名信息、时间戳),一部分为业务返回参数,业务参数内容详见各个业务参数说明。

支付返回业务参数说明如下:

参数名称 类型 是否必填 描述
respCode String 响应码:000000:为成功,其他均为失败,详见错误码描述
respMsg String 响应内容
sign String 签名信息
timestamp String 时间戳
param RefundResult 当响应码为成功时必填
param.html String 响应的html内容,开发者只要将HTML输出即可,渠道类型为:ALI_*时必填
param.url String 备用
param.optional Map 请求是的option

代码示例

os = response.getOutputStream();
PayService payService = new PayService(appId, appSecret);
RefundParams refundParams = new RefundParams();
refundParams.setOrderNo(request.getParameter("orderNo"));// 20151019164317828
refundParams.setRefundAmt(Integer.parseInt(request.getParameter("refundAmt")));// 11
refundParams.setRefundNo(DateUtil.getCurrentDateTime());
refundParams.setRefundReason(request.getParameter("refundReason"));// "我就随便退退"
ResponseParams responseParams = payService.refund(refundParams);
if (payService.verifyResponseSign(responseParams)) {
RefundResult refundResult = (RefundResult) responseParams.getParam();
if (refundResult!=null && refundResult.getHtml() != null && !"".equals(refundResult.getHtml())) {
os.write(refundResult.getHtml().getBytes("UTF-8"));
} else {
String outStr = ForMatJSONStr.format(JSON.toJSONString(responseParams));
os.write(outStr.getBytes("UTF-8"));
}
}else{
os.write(SIGN_ERROR.getBytes("UTF-8"));
}

• 查询单笔订单

查询单笔订单接口接收的参数为orderNo。参数描述如下:

参数名称 类型 是否必填 描述
orderNo String 查询订单号

返回参数为ResponseParams对象,该对象包含了两部分内容,一部分为公共参数(主要包含:响应码、响应内容、签名信息、时间戳),一部分为业务返回参数,业务参数内容详见各个业务参数说明。

支付返回业务参数说明如下:

参数名称 类型 是否必填 描述
respCode String 响应码:000000:为成功,其他均为失败,详见错误码描述
respMsg String 响应内容
sign String 签名信息
timestamp String 时间戳
param OrderVO 当响应码为成功时必填
param.orderNo String 订单号
param.orderTime String 订单时间
param.title String 订单名称
param.payChannelType enum 支付渠道
param.orderStatus String 订单状态: 0 、成功; 1、初始; 2、失败;
param.orderAmt Integer 订单金额

代码示例

PayService payService = new PayService(appId, appSecret);
ResponseParams responseParams = payService.queryOrder(orderNo);

• 批量查询订单

批量查询订单接口接收的参数为QueryParams对象,该对象封装了批量查询接口的各个具体参数。参数描述如下:

参数名称 类型 是否必填 描述
orderNo String 查询订单号
startDate String 开始日期,格式为yyyyMMdd
endDate String 结束日期,格式为yyyyMMdd
pageNo Integer 页码
pageSize Integer 每页记录数
refundNo String 退款流水号
channels List 渠道类型

返回参数为ResponseParams对象,该对象包含了两部分内容,一部分为公共参数(主要包含:响应码、响应内容、签名信息、时间戳),一部分为业务返回参数,业务参数内容详见各个业务参数说明。

支付返回业务参数说明如下:

参数名称 类型 是否必填 描述
respCode String 响应码:000000:为成功,其他均为失败,详见错误码描述
respMsg String 响应内容
sign String 签名信息
timestamp String 时间戳
param List<OrderVO> 当响应码为成功时必填
param[i].orderNo String 订单号
param[i].orderTime String 订单时间
param[i].title String 订单名称
param[i].payChannelType enum 支付渠道
param[i].orderStatus String 订单状态: 0 、成功; 1、初始; 2、失败;
param[i].orderAmt Integer 订单金额

代码示例

PayService payService = new PayService(appId, appSecret);
QueryParams queryParams = new QueryParams();
ResponseParams responseParams = payService.queryOrderList(queryParams);
if (payService.verifyResponseSign(responseParams)) {
String outStr = ForMatJSONStr.format(JSON.toJSONString(responseParams));
System.out.println(outStr);
os.write(outStr.getBytes("UTF-8"));
}else{
os.write(SIGN_ERROR.getBytes("UTF-8"));
}

• 查询单笔退款

查询单笔退款接口接收的参数为orderNo。参数描述如下:

参数名称 类型 是否必填 描述
refundNo String 查询退款流水号

返回参数为ResponseParams对象,该对象包含了两部分内容,一部分为公共参数(主要包含:响应码、响应内容、签名信息、时间戳),一部分为业务返回参数,业务参数内容详见各个业务参数说明。

支付返回业务参数说明如下:

参数名称 类型 是否必填 描述
respCode String 响应码:000000:为成功,其他均为失败,详见错误码描述
respMsg String 响应内容
sign String 签名信息
timestamp String 时间戳
param RefundVO 当响应码为成功时必填
param.orderNo String 订单号
param.refundNo String 退款流水号
param.refundTime String 退款时间
param.refundStatus enum 退款状态: 0 、成功; 1、初始; 2、失败;
param.refundAmt String 退款金额
param.orderAmt Integer 订单金额
param.payChannelType enum 支付渠道

• 查询批量退款

批量查询订单接口接收的参数为QueryParams对象,该对象封装了批量查询接口的各个具体参数。参数描述如下:

参数名称 类型 是否必填 描述
orderNo String 查询订单号
startDate String 开始日期,格式为yyyyMMdd
endDate String 结束日期,格式为yyyyMMdd
pageNo Integer 页码
pageSize Integer 每页记录数
refundNo String 退款流水号
channels List 渠道类型

返回参数为ResponseParams对象,该对象包含了两部分内容,一部分为公共参数(主要包含:响应码、响应内容、签名信息、时间戳),一部分为业务返回参数,业务参数内容详见各个业务参数说明。

支付返回业务参数说明如下:

参数名称 类型 是否必填 描述
respCode String 响应码:000000:为成功,其他均为失败,详见错误码描述
respMsg String 响应内容
sign String 签名信息
timestamp String 时间戳
param List<RefundVO> 当响应码为成功时必填
param[i].orderNo String 订单号
param[i].refundNo String 退款流水号
param[i].refundTime String 退款时间
param[i].refundStatus enum 退款状态: 0 、成功; 1、初始; 2、失败;
param[i].refundAmt String 退款金额
param[i].orderAmt Integer 订单金额

错误码对照表

错误编码 错误描述
000000 处理成功
999999 未知错误
000001 未知交易类型
000002 验签失败
000003 交易类型为空
000004 返回类型非法
000005 请求报文为空
000006 请求格式非法
000007 appId为空
000008 timestamp为空
000009 支付参数非法
000010 支付参数为空
000011 金额非法
000012 订单号为空
000013 订单号长度过长
000014 渠道类型为空
000015 openId为空
000016 appId非法
000017 appSecret非法
000018 渠道标识非法
000019 订单已支付
000020 退款参数非法
000021 退款参数为空
000022 退款流水号为空
000023 订单不存在
000024 退款金额超过订单可退金额
000025 退款流水号长度过长
000026 订单未支付成功
000027 退款流水已存在
000028 应用未设置支付成功webhook
000029 Webhook地址为空
000030 应用未设置退款成功webhook
000031 该应用不支持此渠道
000032 返回URL为空