测试类:Test
package fuiou.h5;
import java.io.IOException;
import net.sf.json.JSONObject;
import fuiou.sdk.CommonReq;
import fuiou.sdk.QueryOrderReq;
public class Test {
//测试环境查询接口地址
public static String url = "";
//测试环境商户号
public static String mchnt_cd = "0001000F0040992";
//测试环境商户公钥-如秘钥不对,请对接群里联系富友技术
public static String mchnt_pub_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTK/DZ0Ve73u2ORRAYrpv07FNHyuTb87xabGMTwEIQV2PhDdAYtiRIO/dAtZ45PUN1N+rtiQQxwIgyKJpYIesFpCbBZ+3YIVf3wlkl9VVSfnUSDWcteN9n0WifBqrKbzJ3gaXi4wXveCMJViqTfgDkfgTV/EC/7h5nwj5VUF6LPQIDAQAB";
//测试环境商户私钥-如秘钥不对,请对接群里联系富友技术
public static String mchnt_pri_key = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJMr8NnRV7ve7Y5FEBium/TsU0fK5NvzvFpsYxPAQhBXY+EN0Bi2JEg790C1njk9Q3U36u2JBDHAiDIomlgh6wWkJsFn7dghV/fCWSX1VVJ+dRINZy1432fRaJ8GqspvMneBpeLjBe94IwlWKpN+AOR+BNX8QL/uHmfCPlVQXos9AgMBAAECgYAzqbMs434m50UBMmFKKNF6kxNRGnpodBFktLO7FTybu/HF6TFp21a1PMe5IYhfk5AAsBZ6OCUOygWFhhdYZN+5W+dweF3kp1rLE4y5CjwqNlk/g22TAndf9znh/ltHFLvITToqu/eh/34tE1gyNxRbsi1olw/1wv8ZRjM3vtM9QQJBANvNwFq+CJHUyFzkXQB7+ycQFnY8wDq8Uw2Hv9ZMjgIntH7FSlJtdu5mAYPPo6f74slO5tFUMNP7EVppqsjYaNkCQQCraD6iKHo+OIlvvYIKiMXatJGD7N1GNhq5CrhUNPWLHwv/Ih2D3JJdF8IUZOPIJfUxTfM2fZYI+EVdsv6s4RcFAkAGjNYbnighOGcUJZYD6q3sVxVkRqEv3ubWs2HrH/Lna4l8caKqXCq8JfwLkod8/QugFiLYwBqIZqX4vMdjHtfZAkBsAl9dbWZCaPvpxp/4JWGPxDLhz9NLV/KU4bVvkoObq++yUHwKyGYOdVcd5MlIKOsNq5Hzp0Vw14lWVuF2bMxFAkBuNrZksvUULNIaWDKd4rQ6GVzUxXuIZW0ZE6atHYDiXPB4jVAjKRtLxZAV1qH9cr1zNJlcg+RbGYUdF9t4A9n5";
//测试环境富友公钥-如秘钥不对,请对接群里联系富友技术
public static String ins_pub_key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKPD4f/3xMjPuHcQSGxPIYZNgF2i0sJhzmKpN3dmzhbKH/1nG+aXUJDhswyitzrI+U0ic/GL/IWB1wQ3noWuLFr8jDSGafenTFiY9c0H9ZAEfqW/oywx95G5JWu5y/ffp4yCmlt8k5kHO/4kE1qnJcGaQlb6/+7t3MPSV5ybmBZwIDAQAB";
public static void main(String[] args) {
try {
postRequestTest();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void postRequestTest() throws IOException {
//查询
CreateOrderReqData order = new CreateOrderReqData();
order.setMchnt_cd(mchnt_cd);
order.setOrder_date("20200513");
order.setOrder_id("F123456");
order.setOrder_amt("10000");
order.setPage_notify_url("");//云闪付和网银支付必填;其他支付不传
order.setBack_notify_url("");
order.setGoods_name("苹果");
order.setGoods_detail("苹果");
order.setFee_type("CNY");
order.setPay_type("WeJsapiPay");//微信公众号只能在微信内置浏览器打开
order.setVer("3.0.0");
JSONObject jsonParam = JSONObject.fromObject(order);
//用富友公钥加密得到密文,此处必须是GBK加密,非GBK加密的中文会变成乱码
String message = RsaUtil.encryptByRsaPub(jsonParam.toString(), ins_pub_key, "GBK");
CommonReq req = new CommonReq();
req.setMchnt_cd(mchnt_cd);
req.setMessage(message);
JSONObject reqJson = JSONObject.fromObject(req);
JSONObject respJson = HttpRequestUtil.httpPost(url, reqJson);
System.out.println("返回的报文=="+respJson);
message = respJson.getString("message");
//商户私钥解密出来密文
String plain = RsaUtil.decryptByRsaPri(message, ins_pub_key, "GBK");
System.out.println("商户私钥解密出来的明文plain=="+plain);
}
}
RsaUtil加密类
package fuiou.h5;
import java.security.Key;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import org.apache.commons.codec.binary.Base64;
public class RsaUtil {
private static final String KEY_ALGORITHM = "RSA";
private static final String ALGORITHM_SHA1 = "SHA1withRSA";
private static final String ALGORITHM_SHA2 = "SHA256withRSA";
private static final String ALGORITHM_MD5RSA = "MD5WithRSA";
static {
try {
java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
} catch (Exception e) {
e.printStackTrace();
}
}
/** SHA1withRSA */
public static String sign2Base64(String base64PriRsa, String inputStr) {
return sign2Base64ByAlg(base64PriRsa, inputStr, ALGORITHM_SHA1, "GBK");
}
/** SHA256withRSA */
public static String sign2Base64BySha2(String base64PriRsa, String inputStr) {
return sign2Base64ByAlg(base64PriRsa, inputStr, ALGORITHM_SHA2,"GBK");
}
/** MD5WithRSA */
public static String sign2Base64ByMd5Rsa(String base64PriRsa, String inputStr) {
return sign2Base64ByAlg(base64PriRsa, inputStr, ALGORITHM_MD5RSA,"GBK");
}
/** SHA1withRSA */
public static String sign2Base64(String base64PriRsa, String inputStr,String charset) {
return sign2Base64ByAlg(base64PriRsa, inputStr, ALGORITHM_SHA1,charset);
}
/** SHA256withRSA */
public static String sign2Base64BySha2(String base64PriRsa, String inputStr,String charset) {
return sign2Base64ByAlg(base64PriRsa, inputStr, ALGORITHM_SHA2,charset);
}
/** MD5WithRSA */
public static String sign2Base64ByMd5Rsa(String base64PriRsa, String inputStr,String charset) {
return sign2Base64ByAlg(base64PriRsa, inputStr, ALGORITHM_MD5RSA,charset);
}
private static String sign2Base64ByAlg(String base64PriRsa, String inputStr, String algorithm,String charset) {
try {
PrivateKey privateKey = genPrivateKey(base64PriRsa);
Signature signature = Signature.getInstance(algorithm, "BC");
signature.initSign(privateKey);
signature.update(inputStr.getBytes(charset));
return Base64.encodeBase64String(signature.sign());
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("");
}
}
/**
* SHA1withRSA
* @return
*/
public static boolean verifySign(String base64PubRsa, String src, String base64SignValue) {
return verifySignByAlg(base64PubRsa, src, base64SignValue, ALGORITHM_SHA1, "GBK");
}
/**
* SHA256withRSA
* @return
*/
public static boolean verifySignBySha2(String base64PubRsa, String src, String base64SignValue) {
return verifySignByAlg(base64PubRsa, src, base64SignValue, ALGORITHM_SHA2, "GBK");
}
/**
* MD5WithRSA
* @return
*/
public static boolean verifySignByMd5Rsa(String base64PubRsa, String src, String base64SignValue) {
return verifySignByAlg(base64PubRsa, src, base64SignValue, ALGORITHM_MD5RSA, "GBK");
}
/**
* SHA1withRSA
* @return
*/
public static boolean verifySign(String base64PubRsa, String src, String base64SignValue,String charset) {
return verifySignByAlg(base64PubRsa, src, base64SignValue, ALGORITHM_SHA1,charset);
}
/** SHA256withRSA
* @return
*/
public static boolean verifySignBySha2(String base64PubRsa, String src, String base64SignValue,String charset) {
return verifySignByAlg(base64PubRsa, src, base64SignValue, ALGORITHM_SHA2,charset);
}
/**MD5WithRSA */
public static boolean verifySignByMd5Rsa(String base64PubRsa, String src, String base64SignValue,String charset) {
return verifySignByAlg(base64PubRsa, src, base64SignValue, ALGORITHM_MD5RSA,charset);
}
private static boolean verifySignByAlg(String base64PubRsa, String src, String base64SignValue, String algorithm,String charset) {
try {
PublicKey publicKey = genPublicKey(base64PubRsa);
Signature signature = Signature.getInstance(algorithm, "BC");
signature.initVerify(publicKey);
signature.update(src.getBytes(charset));
return signature.verify(Base64.decodeBase64(base64SignValue));
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
private static PrivateKey genPrivateKey(String base64Rsa) {
try {
KeyFactory kf = KeyFactory.getInstance(KEY_ALGORITHM, "BC");
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(base64Rsa));
return kf.generatePrivate(keySpec);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
private static PublicKey genPublicKey(String base64Rsa) {
try {
KeyFactory kf = KeyFactory.getInstance(KEY_ALGORITHM, "BC");
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decodeBase64(base64Rsa));
return kf.generatePublic(keySpec);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String convertPubRsaFile2Str(String fileStr){
PublicKey pk = genPublicKey(fileStr);
return Base64.encodeBase64String(pk.getEncoded());
}
public static String convertPriRsaFile2Str(String fileStr){
PrivateKey pk = genPrivateKey(fileStr);
return Base64.encodeBase64String(pk.getEncoded());
}
public static String encryptByRsaPub(String src, String base64PubRsa) {
try {
PublicKey publicKey = genPublicKey(base64PubRsa);
byte[] encryptBytes = encryptByKey(src.getBytes("GBK"), publicKey);
return Base64.encodeBase64String(encryptBytes);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String encryptByRsaPub(String src, String base64PubRsa,String charset) {
try {
PublicKey publicKey = genPublicKey(base64PubRsa);
byte[] encryptBytes = encryptByKey(src.getBytes(charset), publicKey);
return Base64.encodeBase64String(encryptBytes);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String encryptByRsaPri(String src, String base64PubRsa) {
try {
PrivateKey privateKey = genPrivateKey(base64PubRsa);
byte[] encryptBytes = encryptByKey(src.getBytes("GBK"), privateKey);
return Base64.encodeBase64String(encryptBytes);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String encryptByRsaPri(String src, String base64PubRsa,String charset) {
try {
PrivateKey privateKey = genPrivateKey(base64PubRsa);
byte[] encryptBytes = encryptByKey(src.getBytes(charset), privateKey);
return Base64.encodeBase64String(encryptBytes);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String decryptByRsaPri(String base64Src, String base64PriRsa) {
try {
PrivateKey privateKey = genPrivateKey(base64PriRsa);
return new String(decryptKey(Base64.decodeBase64(base64Src), privateKey), "GBK");
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String decryptByRsaPri(String base64Src, String base64PriRsa,String charset) {
try {
PrivateKey privateKey = genPrivateKey(base64PriRsa);
return new String(decryptKey(Base64.decodeBase64(base64Src), privateKey), charset);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String decryptByRsaPub(String base64Src, String base64PriRsa) {
try {
PublicKey publicKey = genPublicKey(base64PriRsa);
return new String(decryptKey(Base64.decodeBase64(base64Src), publicKey), "GBK");
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
public static String decryptByRsaPub(String base64Src, String base64PriRsa,String charset) {
try {
PublicKey publicKey = genPublicKey(base64PriRsa);
return new String(decryptKey(Base64.decodeBase64(base64Src), publicKey),charset);
} catch (Exception e) {
e.printStackTrace();
throw new IllegalArgumentException("RSA异常");
}
}
/**
* 用公钥加密
*/
private static byte[] encryptByKey(byte[] srcData, Key publicKey) {
try {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
int blockSize = cipher.getOutputSize(srcData.length) - 11;
byte[] encryptedData = null;
for (int i = 0; i
<
srcData.length; i += blockSize) {
byte[] doFinal = cipher.doFinal(subarray(srcData, i, i + blockSize));
encryptedData = addAll(encryptedData, doFinal);
}
return encryptedData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static byte[] decryptKey(byte[] srcData, Key key) {
try {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
int blockSize = cipher.getOutputSize(srcData.length);
byte[] decryptData = null;
for (int i = 0; i
<
srcData.length; i += blockSize) {
byte[] doFinal = cipher.doFinal(subarray(srcData, i, i + blockSize));
decryptData = addAll(decryptData, doFinal);
}
return decryptData;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static byte[] subarray(byte[] array, int startIndexInclusive, int endIndexExclusive) {
if (array == null) {
return null;
}
if (startIndexInclusive
<
0) {
startIndexInclusive = 0;
}
if (endIndexExclusive
>
array.length) {
endIndexExclusive = array.length;
}
int newSize = endIndexExclusive - startIndexInclusive;
if (newSize
<
= 0) {
return new byte[0];
}
byte[] subarray = new byte[newSize];
System.arraycopy(array, startIndexInclusive, subarray, 0, newSize);
return subarray;
}
private static byte[] addAll(byte[] array1, byte[] array2) {
if (array1 == null) {
return clone(array2);
} else if (array2 == null) {
return clone(array1);
}
byte[] joinedArray = new byte[array1.length + array2.length];
System.arraycopy(array1, 0, joinedArray, 0, array1.length);
System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
return joinedArray;
}
public static byte[] clone(byte[] array) {
if (array == null) {
return null;
}
return (byte[]) array.clone();
}
}
订单对象
package fuiou.h5;
public class CreateOrderReqData{
//商户代码
private String mchnt_cd = "";
//商户代码
private String sub_mchnt_cd = "";
//订单日期
private String order_date = "";
//订单金额
private String order_amt = "";
//订单流水号
private String order_id = "";
//前端通知,云闪付和H5网银必填,其他非必填
private String page_notify_url = "";
//后台通知
private String back_notify_url = "";
//商品名称
private String goods_name = "";
//商品描述
private String goods_detail = "";
//货币类型
private String fee_type = "";
//用户账户/手机号码
private String user_id = "";
//版本号 默认3.0.0
private String ver = "";
//appid
private String appid = "";
//openid
private String openid = "";
//设备信息-非必填项
private String trx_mac = "";
private String trx_imei = "";
private String trx_imsi = "";
private String trx_iccid = "";
private String trx_wifi_mac = "";
private String trx_gps = "";
private String trx_trm_no = "";
//小程序跳转链接
private String url_link = "";
//支付方式-看接口列表介绍
private String pay_type = "";
//云闪付锁定卡号支付
private String acct_no = "";
//返回上一级操作界面地址,只适用版本号2.0.0
private String go_back_url = "";
//分账信息-适应特定商户
private String bill_params = "";
public String getSub_mchnt_cd() {
return sub_mchnt_cd;
}
public void setSub_mchnt_cd(String sub_mchnt_cd) {
this.sub_mchnt_cd = sub_mchnt_cd;
}
public String getBill_params() {
return bill_params;
}
public void setBill_params(String bill_params) {
this.bill_params = bill_params;
}
public String getAcct_no() {
return acct_no;
}
public void setAcct_no(String acct_no) {
this.acct_no = acct_no;
}
public String getPay_type() {
return pay_type;
}
public void setPay_type(String pay_type) {
this.pay_type = pay_type;
}
public String getUrl_link() {
return url_link;
}
public void setUrl_link(String url_link) {
this.url_link = url_link;
}
public String getTrx_mac() {
return trx_mac;
}
public void setTrx_mac(String trx_mac) {
this.trx_mac = trx_mac;
}
public String getTrx_imei() {
return trx_imei;
}
public void setTrx_imei(String trx_imei) {
this.trx_imei = trx_imei;
}
public String getTrx_imsi() {
return trx_imsi;
}
public void setTrx_imsi(String trx_imsi) {
this.trx_imsi = trx_imsi;
}
public String getTrx_iccid() {
return trx_iccid;
}
public void setTrx_iccid(String trx_iccid) {
this.trx_iccid = trx_iccid;
}
public String getTrx_wifi_mac() {
return trx_wifi_mac;
}
public void setTrx_wifi_mac(String trx_wifi_mac) {
this.trx_wifi_mac = trx_wifi_mac;
}
public String getTrx_gps() {
return trx_gps;
}
public void setTrx_gps(String trx_gps) {
this.trx_gps = trx_gps;
}
public String getTrx_trm_no() {
return trx_trm_no;
}
public void setTrx_trm_no(String trx_trm_no) {
this.trx_trm_no = trx_trm_no;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getMchnt_cd() {
return mchnt_cd;
}
public void setMchnt_cd(String mchnt_cd) {
this.mchnt_cd = mchnt_cd;
}
public String getOrder_date() {
return order_date;
}
public void setOrder_date(String order_date) {
this.order_date = order_date;
}
public String getOrder_amt() {
return order_amt;
}
public void setOrder_amt(String order_amt) {
this.order_amt = order_amt;
}
public String getOrder_id() {
return order_id;
}
public void setOrder_id(String order_id) {
this.order_id = order_id;
}
public String getPage_notify_url() {
return page_notify_url;
}
public void setPage_notify_url(String page_notify_url) {
this.page_notify_url = page_notify_url;
}
public String getBack_notify_url() {
return back_notify_url;
}
public void setBack_notify_url(String back_notify_url) {
this.back_notify_url = back_notify_url;
}
public String getGoods_name() {
return goods_name;
}
public void setGoods_name(String goods_name) {
this.goods_name = goods_name;
}
public String getGoods_detail() {
return goods_detail;
}
public void setGoods_detail(String goods_detail) {
this.goods_detail = goods_detail;
}
public String getFee_type() {
return fee_type;
}
public void setFee_type(String fee_type) {
this.fee_type = fee_type;
}
public String getGo_back_url() {
return go_back_url;
}
public void setGo_back_url(String go_back_url) {
this.go_back_url = go_back_url;
}
public String getUser_id() {
return user_id;
}
public void setUser_id(String user_id) {
this.user_id = user_id;
}
public String getVer() {
return ver;
}
public void setVer(String ver) {
this.ver = ver;
}
}
HttpRequestUtil http请求工具
package fuiou.h5;
import java.io.IOException;
import java.net.URLDecoder;
import net.sf.json.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class HttpRequestUtil{
public static JSONObject httpGet(String url){
JSONObject jsonResult = null;
try {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
String strResult = EntityUtils.toString(response.getEntity());
jsonResult = JSONObject.fromObject(strResult);
url = URLDecoder.decode(url, "UTF-8");
} else {
}
} catch (IOException e) {
e.printStackTrace();
}
return jsonResult;
}
public static JSONObject httpPost(String url,JSONObject jsonParam){
return httpPost(url, jsonParam.toString(), false);
}
public static JSONObject httpPost(String url,String json, boolean noNeedResponse){
DefaultHttpClient httpClient = new DefaultHttpClient();
JSONObject jsonResult = null;
HttpPost method = new HttpPost(url);
try {
if (null != json) {
StringEntity entity = new StringEntity(json, "utf-8");
entity.setContentEncoding("UTF-8");
entity.setContentType("application/json");
method.setEntity(entity);
}
HttpResponse result = httpClient.execute(method);
url = URLDecoder.decode(url, "UTF-8");
if (result.getStatusLine().getStatusCode() == 200) {
String str = "";
try {
str = EntityUtils.toString(result.getEntity());
if (noNeedResponse) {
return null;
}
jsonResult = JSONObject.fromObject(str);
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
return jsonResult;
}
}
公共请求数据
package fuiou.h5;
public class CommonReq{
//商户代码
private String mchnt_cd;
//密文
private String message;
public String getMchnt_cd() {
return mchnt_cd;
}
public void setMchnt_cd(String mchnt_cd) {
this.mchnt_cd = mchnt_cd;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}