package com.panzhihua.applets.unionpay;
|
|
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.codec.digest.DigestUtils;
|
|
import javax.crypto.Mac;
|
import javax.crypto.spec.SecretKeySpec;
|
import java.io.*;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
import java.net.URLConnection;
|
|
/**
|
* @author kkqiao
|
* 全民付移动支付小程序支付订单关闭接口
|
* 说明:
|
* 用户创建订单之后,对未支付的订单进行关闭操作
|
* 测试环境:http://58.247.0.18:29015/v1/netpay/close
|
* 生产环境:https://api-mop.chinaums.com/v1/netpay/close
|
*/
|
public class Close {
|
|
// static String url = "https://test-api-open.chinaums.com/v1/netpay/query";
|
static String url = "https://api-mop.chinaums.com/v1/netpay/close";
|
|
public static void main(String[] args) throws Exception{
|
//1. 组建请求报文
|
CloseBody reqBody = new CloseBody();
|
reqBody.requestTimestamp = "2019-08-09 17:12:55";
|
reqBody.mid = "898460107420248";
|
reqBody.tid = "00000001";
|
reqBody.instMid = "MINIDEFAULT";
|
reqBody.merOrderId = "101771307dc89764b477474";
|
System.out.println("request body:\n"+reqBody);
|
|
//2. 获取认证报文,timestamp为当前日期,老旧日期无法请求成功
|
String authorization = getAuthorization(UnionpayContent.APPID,UnionpayContent.APPKEY,
|
"20190809171200","nonce",reqBody.toString());
|
System.out.println("authorization:\n"+authorization);
|
|
//3. 发送http请求,并解析返回信息
|
String response = request(url,authorization,reqBody.toString());
|
System.out.println("response:\n"+response);
|
}
|
|
/**
|
* 发送http请求
|
* @param url 请求url
|
* @param authorization 认证报文
|
* @param reqBody 请求体
|
* @return response
|
*/
|
static String request(String url, String authorization, String reqBody){
|
String response = "";
|
PrintWriter out = null;
|
BufferedReader in = null;
|
try{
|
URL realUrl = new URL(url);
|
URLConnection conn = realUrl.openConnection();
|
HttpURLConnection httpUrlConnection = (HttpURLConnection) conn;
|
httpUrlConnection.setRequestProperty("Content-Type", "application/json");
|
httpUrlConnection.setRequestProperty("authorization",authorization);
|
httpUrlConnection.setDoOutput(true);
|
httpUrlConnection.setDoInput(true);
|
out = new PrintWriter(httpUrlConnection.getOutputStream());
|
out.write(reqBody);
|
out.flush();
|
httpUrlConnection.connect();
|
in = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream()));
|
String line;
|
while ((line = in.readLine()) != null) {
|
response += line;
|
}
|
}catch(Exception e){
|
e.printStackTrace();
|
} finally {
|
try {
|
if (out != null) { out.close();}
|
if (in != null) {in.close();}
|
} catch (Exception ex) {
|
ex.printStackTrace();
|
}
|
}
|
return response;
|
}
|
|
/**
|
* 获取签名头
|
* @param appid
|
* @param appkey
|
* @param timestamp 格式:"yyyyMMddHHmmss"
|
* @param nonce 随机字符串,
|
* @param body 请求体
|
* @return authorization 认证报文
|
* @throws Exception
|
*/
|
static String getAuthorization(String appid, String appkey, String timestamp, String nonce, String body) throws Exception {
|
byte[] data = body.getBytes("utf-8");
|
InputStream is = new ByteArrayInputStream(data);
|
String testSH = DigestUtils.sha256Hex(is);
|
String s1 = appid+timestamp+nonce+testSH;
|
Mac mac = Mac.getInstance("HmacSHA256");
|
mac.init(new SecretKeySpec(appkey.getBytes("utf-8"),"HmacSHA256"));
|
byte[] localSignature = mac.doFinal(s1.getBytes("utf-8"));
|
String localSignatureStr = Base64.encodeBase64String(localSignature);
|
return "OPEN-BODY-SIG AppId="+"\""+appid+"\""+", Timestamp="+"\""+timestamp+"\""+", Nonce="+"\""+nonce+"\""+", Signature="+"\""+localSignatureStr+"\"";
|
}
|
|
static class CloseBody{
|
//消息ID
|
String msgId;
|
//报文请求时间,格式yyyy-MM-ddHH:mm:ss
|
String requestTimestamp;
|
//请求系统预留字段
|
String srcReserve;
|
//商户号
|
String mid;
|
//终端号
|
String tid;
|
//业务类型
|
String instMid;
|
//商户订单号
|
String merOrderId;
|
|
String toJson(){
|
StringBuilder sb = new StringBuilder();
|
sb.append("{");
|
if (this.msgId != null) sb.append("\"msgId\":\"" + this.msgId + "\",");
|
if (this.requestTimestamp != null) sb.append("\"requestTimestamp\":\"" + this.requestTimestamp + "\",");
|
if (this.srcReserve != null) sb.append("\"srcReserve\":\"" + this.srcReserve + "\",");
|
if (this.mid != null) sb.append("\"mid\":\"" + this.mid + "\",");
|
if (this.tid != null) sb.append("\"tid\":\"" + this.tid + "\",");
|
if (this.instMid != null) sb.append("\"instMid\":\"" + this.instMid + "\",");
|
if (this.merOrderId != null) sb.append("\"merOrderId\":\"" + this.merOrderId + "\",");
|
if (sb.charAt(sb.length() - 1) == ',')
|
sb.deleteCharAt(sb.length() - 1);
|
sb.append("}");
|
return sb.toString();
|
}
|
|
public String toString(){
|
return this.toJson();
|
}
|
|
}
|
|
}
|