package weixin.popular.util; import java.util.LinkedHashMap; import java.util.Map; import java.util.UUID; import weixin.popular.bean.pay.PayJsRequest; import weixin.popular.bean.pay.PayNativeReply; import weixin.popular.bean.pay.PayNativeRequest; import weixin.popular.bean.pay.PayPackage; import weixin.popular.bean.paymch.MchPayApp; import weixin.popular.bean.paymch.MchPayNativeReply; import weixin.popular.bean.paymch.PapayEntrustweb; public class PayUtil { /** * 生成支付JS请求JSON * @param payPackage payPackage * @param appId appId * @param paternerKey paternerKey * @param paySignkey appkey * @return json */ public static String generatePayJsRequestJson(PayPackage payPackage, String appId, String paternerKey, String paySignkey){ Map<String, String> mapP = MapUtil.objectToMap(payPackage); String package_ = SignatureUtil.generatePackage(mapP, paternerKey); PayJsRequest payJsRequest = new PayJsRequest(); payJsRequest.setAppId(appId); payJsRequest.setNonceStr(UUID.randomUUID().toString()); payJsRequest.setPackage_(package_); payJsRequest.setSignType("sha1"); payJsRequest.setTimeStamp(System.currentTimeMillis()/1000+""); Map<String, String> mapS = MapUtil.objectToMap(payJsRequest,"signType","paySign"); String paySign = SignatureUtil.generatePaySign(mapS,paySignkey); payJsRequest.setPaySign(paySign); return JsonUtil.toJSONString(payJsRequest); } /** * 生成Native支付JS请求URL * @param appid appid * @param productid productid * @param paySignkey paySignkey * @return url */ public static String generatePayNativeRequestURL( String appid, String productid, String paySignkey){ PayNativeRequest payNativeRequest = new PayNativeRequest(); payNativeRequest.setAppid(appid); payNativeRequest.setNoncestr(UUID.randomUUID().toString()); payNativeRequest.setProductid(productid); payNativeRequest.setTimestamp(System.currentTimeMillis()/1000+""); Map<String, String> mapS = MapUtil.objectToMap(payNativeRequest,"sign"); String sign = SignatureUtil.generatePaySign(mapS,paySignkey); payNativeRequest.setSign(sign); Map<String, String> map = MapUtil.objectToMap(payNativeRequest); return "weixin://wxpay/bizpayurl?" + MapUtil.mapJoin(map, false, false); } /** * 生成 native 支付回复XML * @param payPackage payPackage * @param appId appId * @param retCode 0 正确 * @param retErrMsg retErrMsg * @param paternerKey paternerKey * @return xml */ public static String generatePayNativeReplyXML(PayPackage payPackage, String appId, String retCode, String retErrMsg, String paternerKey){ PayNativeReply payNativeReply = new PayNativeReply(); payNativeReply.setAppid(appId); payNativeReply.setNoncestr(UUID.randomUUID().toString()); payNativeReply.setRetcode(retCode); payNativeReply.setReterrmsg(retErrMsg); payNativeReply.setTimestamp(System.currentTimeMillis()+""); String package_ = SignatureUtil.generatePackage(MapUtil.objectToMap(payPackage),paternerKey); payNativeReply.setPackage_(package_); payNativeReply.setSignmethod("sha1"); String appSignature = SignatureUtil.generatePackage( MapUtil.objectToMap(payNativeReply,"appsignature","signmethod"), paternerKey); payNativeReply.setAppsignature(appSignature); return XMLConverUtil.convertToXML(payNativeReply); } //MCH ------------------------------------------------- /** * (MCH)生成支付JS请求对象 * @param prepay_id 预支付订单号 * @param appId appId * @param key 商户支付密钥 * @return json */ public static String generateMchPayJsRequestJson(String prepay_id,String appId,String key){ String package_ = "prepay_id="+prepay_id; PayJsRequest payJsRequest = new PayJsRequest(); payJsRequest.setAppId(appId); payJsRequest.setNonceStr(UUID.randomUUID().toString().replace("-", "")); payJsRequest.setPackage_(package_); payJsRequest.setSignType("MD5"); payJsRequest.setTimeStamp(System.currentTimeMillis()/1000+""); //@fantycool 提交修正bug //Map<String, String> mapS = MapUtil.objectToMap(payJsRequest,"signType","paySign"); Map<String, String> mapS = MapUtil.objectToMap(payJsRequest); String paySign = SignatureUtil.generateSign(mapS,key); payJsRequest.setPaySign(paySign); return JsonUtil.toJSONString(payJsRequest); } /** * (MCH)生成Native支付请求URL * @param appid appid * @param mch_id mch_id * @param productid productid * @param key key * @return url */ public static String generateMchPayNativeRequestURL( String appid, String mch_id, String productid, String key){ Map<String,String> map = new LinkedHashMap<String,String>(); map.put("appid",appid); map.put("mch_id",mch_id); map.put("time_stamp",System.currentTimeMillis()/1000+""); map.put("nonce_str",UUID.randomUUID().toString().replace("-", "")); map.put("product_id",productid); String sign = SignatureUtil.generateSign(map,key); map.put("sign",sign); return "weixin://wxpay/bizpayurl?" + MapUtil.mapJoin(map, false, false); } /** * (MCH)生成 native 支付回复XML * @param mchPayNativeReply mchPayNativeReply * @param key key * @return xml */ public static String generateMchPayNativeReplyXML(MchPayNativeReply mchPayNativeReply,String key){ Map<String, String> map = MapUtil.objectToMap(mchPayNativeReply); String sign = SignatureUtil.generateSign(map,key); mchPayNativeReply.setSign(sign); return XMLConverUtil.convertToXML(mchPayNativeReply); } /** * (MCH)生成支付APP请求数据 * @param prepay_id 预支付订单号 * @param appId appId * @param partnerid 商户平台号 * @param key 商户支付密钥 * @return app data */ public static MchPayApp generateMchAppData(String prepay_id,String appId,String partnerid,String key){ Map<String, String> wx_map = new LinkedHashMap<String, String>(); wx_map.put("appid", appId); wx_map.put("partnerid", partnerid); wx_map.put("prepayid", prepay_id); wx_map.put("package", "Sign=WXPay"); wx_map.put("noncestr", UUID.randomUUID().toString().replace("-", "")); wx_map.put("timestamp", System.currentTimeMillis()/1000+""); String sign = SignatureUtil.generateSign(wx_map,key); MchPayApp mchPayApp = new MchPayApp(); mchPayApp.setAppid(appId); mchPayApp.setPartnerid(partnerid); mchPayApp.setPrepayid(prepay_id); mchPayApp.setPackage_(wx_map.get("package")); mchPayApp.setNoncestr(wx_map.get("noncestr")); mchPayApp.setTimestamp(wx_map.get("timestamp")); mchPayApp.setSign(sign); return mchPayApp; } /** * 生成代扣签约URL * @param papayEntrustweb papayEntrustweb * @param key key * @return url */ public static String generatePapayEntrustwebURL(PapayEntrustweb papayEntrustweb,String key){ Map<String,String> map = MapUtil.objectToMap( papayEntrustweb); String sign = SignatureUtil.generateSign(map,key); map.put("sign", sign); String params = MapUtil.mapJoin(map, false, true); return "https://api.mch.weixin.qq.com/papay/entrustweb?"+params; } }