1.进入官网,在右下角热门能力里面找到在线网关支付
1.1.SDK&Demo下载
主要提供了服务端SDK,包含JAVA、PHP和.NET三语言版本封装了签名&验签、HTTP接口请求等基础功能。
1.2.我要测试
产品列表中找到在线网关支付,点击集成测试,这样才能保证接口调用正常。
1.3.测试参数
1.3.1.测试参数
主要是取测试商户号(都是77开头)以及测试证书5.1.0(demo代码里面默认的就是5.1.0)。
1.3.2.测试数据
主要是为了获取后面下单之后模拟支付需要的银行卡以及手机验证码等信息。
2.正式开始编写Java代码
2.1.准备证书
将1.3.1测试参数中的测试证书5.1.0放到本地磁盘中,三个文件一个压缩包,压缩包解压之后将四个文件放到一起。
2.2.复制SDK&Demo下载的所需的相关文件
2.2.1.加载依赖包
2.2.2.配置参数(acp_sdk.properties)
2.2.3.取demo封装文件,稍作调整。
2.2.4.参数初始化
2.3.订单支付以及订单查询接口代码编写
2.3.1.PayController入口代码
2.3.2.PayService接口定义代码
2.3.3.PayServiceImpl接口逻辑实现代码
######支付接口
@Override
public String pay() {
Map<String, String> requestData = new HashMap<>();
/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
// 版本号,全渠道默认值
requestData.put("version", DemoBase.version);
// 字符集编码,可以使用UTF-8,GBK两种方式
requestData.put("encoding", DemoBase.encoding);
// 签名方法
requestData.put("signMethod", SDKConfig.getConfig().getSignMethod());
// 交易类型 ,01:消费
requestData.put("txnType", "01");
// 交易子类型, 01:自助消费
requestData.put("txnSubType", "01");
// 业务类型,B2C网关支付,手机wap支付
requestData.put("bizType", "000201");
// 渠道类型,这个字段区分B2C网关支付和手机wap支付;07:PC,平板 08:手机
requestData.put("channelType", "07");
/***商户接入参数***/
// 商户号码,请改成自己申请的正式商户号或者open上注册得来的777测试商户号
requestData.put("merId", "77729005820xxxx");
// 接入类型,0:直连商户
requestData.put("accessType", "0");
// 商户订单号,8-40位数字字母,不能含“-”或“_”,可以自行定制规则
requestData.put("orderId", getUUID());
// 订单发送时间,取系统时间,格式为yyyyMMddHHmmss,必须取当前时间,否则会报txnTime无效
requestData.put("txnTime", DemoBase.getCurrentTime());
// 交易币种(境内商户一般是156 人民币)
requestData.put("currencyCode", "156");
// 交易金额,单位分,不要带小数点
requestData.put("txnAmt", "10000");
requestData.put("riskRateInfo", "{commodityName=测试商品名称}");
// 前台通知地址
requestData.put("frontUrl", DemoBase.frontUrl);
//后台通知地址
requestData.put("backUrl", DemoBase.backUrl);
// 订单超时时间
requestData.put("payTimeout", new SimpleDateFormat("yyyyMMddHHmmss").format(new Date().getTime() + 15 * 60 * 1000));
// 报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
Map<String, String> submitFromData = AcpService.sign(requestData,DemoBase.encoding);
// 获取请求银联的前台地址:对应属性文件acp_sdk.properties文件中的acpsdk.frontTransUrl
String requestFrontUrl = SDKConfig.getConfig().getFrontRequestUrl();
// 生成自动跳转的Html表单
String html = AcpService.createAutoFormHtml(requestFrontUrl, submitFromData,DemoBase.encoding);
return html;
}
######生成订单号
public static String getUUID(){
// 随机生成一位整数
int random = (int) (Math.random() * 9 + 1);
String valueOf = String.valueOf(random);
// 生成uuid的hashCode值
int hashCode = UUID.randomUUID().toString().hashCode();
// 可能为负数
if(hashCode < 0){
hashCode = -hashCode;
}
String value = valueOf + String.format("%015d", hashCode);
System.out.println(value);
return value;
}
######查询订单状态
@Override
public Map<String, String> query(String orderId, String txnTime){
Map<String, String> data = new HashMap<>();
/***银联全渠道系统,产品参数,除了encoding自行选择外其他不需修改***/
// 版本号
data.put("version",DemoBase.version);
// 字符集编码 可以使用UTF-8,GBK两种方式
data.put("encoding", DemoBase.encoding);
// 签名方法
data.put("signMethod", SDKConfig.getConfig().getSignMethod());
// 交易类型 00-默认
data.put("txnType", "00");
// 交易子类型 默认00
data.put("txnSubType", "00");
// 业务类型 B2C网关支付,手机wap支付
data.put("bizType", "000000");
/***商户接入参数***/
// 商户号码,请改成自己申请的商户号或者open上注册得来的777商户号测试
data.put("merId","77729005820xxxx");
// 接入类型,商户接入固定填0,不需修改
data.put("accessType", "0");
/***要调通交易以下字段必须修改***/
// 商户订单号,每次发交易测试需修改为被查询的交易的订单号
data.put("orderId", orderId);
// 订单发送时间,每次发交易测试需修改为被查询的交易的订单发送时间
data.put("txnTime", txnTime);
// 报文中certId,signature的值是在signData方法中获取并自动赋值的,只要证书配置正确即可。
Map<String, String> reqData = AcpService.sign(data, DemoBase.encoding);
// 交易请求url从配置文件读取对应属性文件acp_sdk.properties中的 acpsdk.singleQueryUrl
String url = SDKConfig.getConfig().getSingleQueryUrl();
// 这里调用signData之后,调用submitUrl之前不能对submitFromData中的键值对做任何修改,如果修改会导致验签不通过
Map<String, String> rspData = AcpService.post(reqData, url, DemoBase.encoding);
return rspData;
}
3.测试
3.1.本地项目需要能外网访问,因此需要实现内网穿透
我使用的是ngrok,官网下载之后,运行:ngrok http 8080
3.2.启动本地项目
3.3.调用在线支付接口
浏览器地址输入:https://52d7-220-203-228-57.ngrok-free.app/union/pay,输入1.3.2测试数据中的卡号(6216261000000000018)以及密码(123456)
3.4.调用订单查询接口