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.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为空 |