微信退款

来源:互联网 发布:php 商城怎么删除订单 编辑:程序博客网 时间:2024/06/03 02:01

获得签名sign基本和微信支付一样,只是后边写个固定方法即可,只是先要下载证书apiclient_cert.p12;

当时用的是企业号不是公众号,不过基本一致

直接附上代码:

//申请退款
@RequestMapping("toreturn")
@ResponseBody
public Map<String, Object> toreturn(HttpServletRequest req,HttpServletResponse resp,Model model){
Map<String, Object> dataMap=new HashMap<String,Object>();
JSONObject getJson = HttpsUtil.gainToken(WXConfig.COMPANY_ACCESS_TOKEN_URL+"corpid="+WXConfig.APPID+"&corpsecret="+WXConfig.APPSECRET);
String access_token=getJson.getString("access_token");
JSONObject t=new JSONObject();
t.put("userid", readCookie("wapuser", req));
JSONObject getJson3 = HttpsUtil.callInterface(WXConfig.CONVERT_TO_OPENID+"access_token="+access_token,t.toString());
String open_id=getJson3.getString("openid");
//商户相关资料 
String partner = WXConfig.PARTNER;
String partnerkey = WXConfig.PARTENR_KEY;

if (!StringUtil.isEmpty(open_id)) {
String strReq=req.getParameter("out_trade_no");
int order_price=1;//支付金额
Order order=orderService.queryBySn(strReq);
String sn=order.getSn();
order_price=(int)(order.getOrder_amount()*10*10);
    System.out.println("sn:"+sn+"------------------money:"+order_price);
    //商户号
    String mch_id = partner;
    //随机数 
    String nonce_str = sn;
    //商户订单号
    String out_trade_no = sn;
    //商户退款单号
    String out_refund_no=sn;
    //非必输
   
    SortedMap<String, String> packageParams = new TreeMap<String, String>();
    packageParams.put("appid", WXConfig.APPID);  
    packageParams.put("mch_id", mch_id);  
    packageParams.put("nonce_str", nonce_str);  
    packageParams.put("op_user_id", WXConfig.PARTNER);  
    packageParams.put("out_refund_no", out_refund_no);  
    packageParams.put("out_trade_no", out_trade_no);  
   
   
    //这里写的金额为1 分到时修改
    packageParams.put("refund_fee",order_price+"");  
    packageParams.put("total_fee", order_price+"");  
    //System.out.println("packageParams=========================="+JsonUtil.obj2json(packageParams));
    RequestHandler reqHandler = new RequestHandler(req, resp);
    reqHandler.init(WXConfig.APPID, WXConfig.APPSECRET, partnerkey);
   
    String sign = reqHandler.createSign(packageParams);
    String xml="<xml>"+
    "<appid>"+WXConfig.APPID+"</appid>"+
    "<mch_id>"+mch_id+"</mch_id>"+
    "<nonce_str>"+nonce_str+"</nonce_str>"+
    "<op_user_id>"+ WXConfig.PARTNER+"</op_user_id>"+
    "<sign>"+sign+"</sign>"+
    "<out_trade_no>"+out_trade_no+"</out_trade_no>"+
    "<out_refund_no>"+out_refund_no+"</out_refund_no>"+
    //金额,这里写的1 分到时修改
               "<refund_fee>"+order_price+"</refund_fee>"+
    "<total_fee>"+order_price+"</total_fee>"+
    "</xml>";
    System.out.println("xml="+xml);
    String allParameters = "";
    try {
    allParameters =  reqHandler.genPackage(packageParams);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    String createOrderURL = "https://api.mch.weixin.qq.com/secapi/pay/refund";
    String return_code="";
    try {
    String jsonStr=ClientCustomSSL.doRefund(createOrderURL, xml);
    if(StringUtil.isEmpty(jsonStr)){
    dataMap.put("code", "-1");
        dataMap.put("message", "");
        return dataMap;
    }else{//退款成功,取消订单
    //orderService.cancelOrder(order.getId());
    }
    System.out.println(jsonStr+"-----");
    } catch (Exception e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
    dataMap.put("code", "0");
    dataMap.put("message", "");
    return dataMap;
}
dataMap.put("code", "0");
dataMap.put("message", "");
return dataMap;
}






 //申请退款
    public static String doRefund(String url, String data) throws Exception {
    System.out.println("-----dorefund1");
    //(已下载)
    KeyStore keyStore = KeyStore.getInstance("PKCS12");
    FileInputStream is = new FileInputStream(new File("/diorp12/apiclient_cert.p12"));
try {
keyStore.load(is, "1234567".toCharArray());// 这里写密码..默认是你的MCHID
} finally {
is.close();
}
    System.out.println("-----dorefund22222");
    // Trust own CA and all self-signed certs
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, "1234567".toCharArray())// 这里也是写密码的
.build();
    //已导入服务器
        /**
    KeyStore keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
    keyStore.load(null, null);
    // Trust own CA and all self-signed certs
    SSLContext sslcontext = SSLContexts.custom()
    .loadKeyMaterial(keyStore, "".toCharArray())// 这里也是写密码的
    .build();
    **/
    // Allow TLSv1 protocol only
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext, new String[] { "TLSv1" }, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
    CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
    String return_code = "";
try {
HttpPost httpost = new HttpPost(url); // 设置响应头信息
httpost.addHeader("Connection", "keep-alive");
httpost.addHeader("Accept", "*/*");
httpost.addHeader("Content-Type",
"application/x-www-form-urlencoded; charset=UTF-8");
httpost.addHeader("Host", "api.mch.weixin.qq.com");
httpost.addHeader("X-Requested-With", "XMLHttpRequest");
httpost.addHeader("Cache-Control", "max-age=0");
httpost.addHeader("User-Agent",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");
httpost.setEntity(new StringEntity(data, "UTF-8"));
CloseableHttpResponse response = httpclient.execute(httpost);
try {
HttpEntity entity = response.getEntity();


String jsonStr = EntityUtils.toString(response.getEntity(),
"UTF-8");
EntityUtils.consume(entity);
System.out.println("jsonStr=" + jsonStr);
if (jsonStr.indexOf("FAIL") != -1) {
return return_code;
}
return "SUCCESS";
} finally {
response.close();
}
} finally {
httpclient.close();
}
    }

0 0
原创粉丝点击