SFUtils.java 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. package com.yihu.wlyy.util;
  2. import com.yihu.wlyy.entity.organization.Hospital;
  3. import com.yihu.wlyy.entity.patient.prescription.PrescriptionExpressage;
  4. import com.yihu.wlyy.entity.patient.prescription.PrescriptionInfo;
  5. import com.yihu.wlyy.service.app.prescription.PrescriptionInfoService;
  6. import org.apache.commons.lang.StringUtils;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Component;
  11. import sun.misc.BASE64Encoder;
  12. import java.io.FileInputStream;
  13. import java.io.InputStream;
  14. import java.security.MessageDigest;
  15. import java.util.List;
  16. /**
  17. * 顺丰速递接口相关的一些公用方法
  18. * @author huangwenjie 2017.8.2
  19. */
  20. @Component
  21. public class SFUtils {
  22. private static Logger logger = LoggerFactory.getLogger(SFUtils.class);
  23. @Autowired
  24. private PrescriptionInfoService prescriptionInfoService;
  25. /**
  26. * 生成接口校验码
  27. * 1.先把XML报文与checkword前后连接。
  28. * 2.把连接后的字符串做 MD5(16位) 编码。
  29. * 3.把MD5编码后的数据进行 Base64 编码,此时编码后的字符串即为校验码。
  30. * @param xml xml报文
  31. * @param sf_check_word 接口check_word
  32. * @return
  33. */
  34. public String verifyCodeSFXmlStr(String xml,String sf_check_word){
  35. String verifyCode = xml+sf_check_word;
  36. verifyCode = md5EncryptAndBase64(verifyCode);
  37. return verifyCode;
  38. }
  39. /**
  40. * 查询派送地址是否属于顺丰的派送范围
  41. * @param d_address 派送地址
  42. * @param sf_code 顺丰接口接入码
  43. * @param orderid 订单ID
  44. * @param j_tel 寄方电话
  45. * @param j_address 寄方地址
  46. * @param d_tel 收方电话
  47. * @return
  48. */
  49. public String getSFOrderFilterXml(String d_address,String sf_code,String orderid,String j_tel,String j_address,String d_tel){
  50. //head 传入接口接入码
  51. StringBuilder xml = new StringBuilder("<Request service='OrderFilterService' lang='zh-cn'><Head>"+sf_code+"</Head><Body>");
  52. xml.append("<OrderFilter filter_type='1' ");
  53. //订单号
  54. if(StringUtils.isNotBlank(orderid)){
  55. xml.append("orderid='"+orderid+"' ");
  56. }
  57. //派送地址,必填
  58. xml.append("d_address='"+d_address+"'/>");
  59. //如果扩张字段有不为空的,则增加扩张字段参数
  60. if(StringUtils.isNotBlank(j_tel) ||
  61. StringUtils.isNotBlank(j_address)||
  62. StringUtils.isNotBlank(d_tel)){
  63. xml.append("<OrderFilterOption ");
  64. //寄方电话
  65. if(StringUtils.isNotBlank(j_tel)){
  66. xml.append("j_tel='"+j_tel+"' ");
  67. }
  68. //寄方地址
  69. if(StringUtils.isNotBlank(j_address)){
  70. xml.append("j_address='"+j_address+"' ");
  71. }
  72. //收方电话
  73. if(StringUtils.isNotBlank(d_tel)){
  74. xml.append("d_tel='"+d_tel+"' ");
  75. }
  76. xml.append("/></OrderFilter>");
  77. }
  78. xml.append("</Body></Request>");
  79. return xml.toString();
  80. }
  81. /**
  82. * 向顺丰快递下订单
  83. * @param sfexpress_obj
  84. * @param hospital
  85. * @return
  86. */
  87. public String postSFOrderService(PrescriptionExpressage sfexpress_obj, Hospital hospital, String sf_code) {
  88. //head 传入接口接入码
  89. StringBuilder xml = new StringBuilder("<Request service='OrderService' lang='zh-cn'><Head>"+sf_code+"</Head><Body>");
  90. xml.append("<Order ");
  91. //订单号(快递业务号作为订单号"SF开头的为顺丰快递")
  92. xml.append("orderid='"+sfexpress_obj.getCode()+"' ");
  93. /**
  94. * --------寄方参数------
  95. */
  96. //寄件方公司名称
  97. if(StringUtils.isNotBlank(hospital.getName())){
  98. xml.append("j_company='"+hospital.getName()+"' ");
  99. }
  100. //寄方联系人
  101. if(StringUtils.isNotBlank(hospital.getName())){
  102. xml.append("j_contact='"+hospital.getName()+"' ");
  103. }
  104. //寄件方联系电话
  105. if(StringUtils.isNotBlank(hospital.getPhone())){
  106. xml.append("j_tel='"+hospital.getPhone()+"' ");
  107. xml.append("j_mobile='"+hospital.getPhone()+"' ");
  108. }
  109. //寄方所在省份
  110. if(StringUtils.isNotBlank(hospital.getProvinceName())){
  111. xml.append("j_province='"+hospital.getProvinceName()+"' ");
  112. }
  113. //寄方所在城市
  114. if(StringUtils.isNotBlank(hospital.getCityName())){
  115. xml.append("j_city='"+hospital.getCityName()+"' ");
  116. }
  117. //寄方所在县/区
  118. if(StringUtils.isNotBlank(hospital.getTownName())){
  119. xml.append("j_county='"+hospital.getTownName()+"' ");
  120. }
  121. //寄件方详细地址,包括省市县/区
  122. if(StringUtils.isNotBlank(hospital.getAddress())){
  123. xml.append("j_address='"+hospital.getAddress()+"' ");
  124. }
  125. /**
  126. * --------收方参数------
  127. */
  128. //派送地址,必填
  129. xml.append("d_address='"+sfexpress_obj.getAddress()+"' ");
  130. //到件方单位名称,因为接口不能为空,这里默认放到件方联系人
  131. xml.append("d_company='"+sfexpress_obj.getName()+"' ");
  132. //到件方联系人
  133. xml.append("d_contact='"+sfexpress_obj.getName()+"' ");
  134. //到件方联系电话
  135. xml.append("d_tel='"+sfexpress_obj.getPhone()+"' ");
  136. //到件方手机
  137. if(StringUtils.isNotBlank(sfexpress_obj.getMobile())){
  138. xml.append("d_mobile='"+sfexpress_obj.getMobile()+"' ");
  139. }
  140. xml.append("d_province='"+sfexpress_obj.getProvinceName()+"' ");
  141. xml.append("d_city='"+sfexpress_obj.getCityName()+"' ");
  142. xml.append("d_county='"+sfexpress_obj.getTownName()+"' ");
  143. //快件产品类别:11,医药常温,1:顺丰标快
  144. //付款方式:1:寄方付,2:收方付 3:第三方付
  145. xml.append("express_type='1' pay_method='2' >");
  146. // xml.append("express_type='11' pay_method='1' custid='9999999999'>");
  147. //获取订单的药品详情
  148. List<PrescriptionInfo> prescriptionInfolist = prescriptionInfoService.getPrescriptionInfo(sfexpress_obj.getPrescriptionCode());
  149. if(!prescriptionInfolist.isEmpty()){
  150. for (int i = 0; i < prescriptionInfolist.size(); i++) {
  151. xml.append("<Cargo name='"+prescriptionInfolist.get(i).getDrugName()+"' count='"+prescriptionInfolist.get(i).getNum()+"'></Cargo>");
  152. }
  153. }
  154. xml.append("</Order></Request>");
  155. return xml.toString();
  156. }
  157. /**
  158. * 顺丰路由查询
  159. * @param sfexpress_obj
  160. * @param sf_code
  161. * @return
  162. */
  163. public String getRoutInfos(PrescriptionExpressage sfexpress_obj, String sf_code) {
  164. //head 传入接口接入码
  165. StringBuilder xml = new StringBuilder("<Request service='RouteService' lang='zh-cn'><Head>"+sf_code+"</Head><Body>");
  166. xml.append("<RouteRequest tracking_type='1' method_type='1' ").append("tracking_number='"+sfexpress_obj.getMailno()+"' />");
  167. xml.append("</Body></Request>");
  168. return xml.toString();
  169. }
  170. /**
  171. * 订单结果查询接口
  172. * @param sfexpress_objCode
  173. * @param sf_code
  174. * @return
  175. */
  176. public String sfOrderSearchService(String sfexpress_objCode, String sf_code) {
  177. StringBuilder xml = new StringBuilder("<Request service='OrderSearchService' lang='zh-cn'><Head>"+sf_code+"</Head><Body>");
  178. xml.append("<OrderSearch orderid='"+sfexpress_objCode+"'/>");
  179. xml.append("</Body></Request>");
  180. return xml.toString();
  181. }
  182. //-----------顺丰快递验证码加密的相关方法------------------START
  183. public static String loadFile(String fileName) {
  184. InputStream fis;
  185. try {
  186. fis = new FileInputStream(fileName);
  187. byte[] bs = new byte[fis.available()];
  188. fis.read(bs);
  189. String res = new String(bs);
  190. fis.close();
  191. return res;
  192. } catch (Exception e) {
  193. throw new RuntimeException(e);
  194. }
  195. }
  196. public static String md5EncryptAndBase64(String str) {
  197. return encodeBase64(md5Encrypt(str));
  198. }
  199. private static byte[] md5Encrypt(String encryptStr) {
  200. try {
  201. MessageDigest md5 = MessageDigest.getInstance("MD5");
  202. md5.update(encryptStr.getBytes("utf8"));
  203. return md5.digest();
  204. } catch (Exception e) {
  205. throw new RuntimeException(e);
  206. }
  207. }
  208. private static String encodeBase64(byte[] b) {
  209. sun.misc.BASE64Encoder base64Encode = new BASE64Encoder();
  210. String str = base64Encode.encode(b);
  211. return str;
  212. }
  213. public static void main(String[] args) {
  214. String xml = "<Request service='OrderSearchService' lang='zh-cn'><Head>SDDF</Head><Body><OrderSearch orderid='6daa6baec5fd4b65a1b023a8b60e2e76'/></Body></Request>";
  215. String check_word = "ttzlgGyOQu4L";
  216. System.out.println(md5EncryptAndBase64(xml + check_word));
  217. // System.out.println(md5EncryptAndBase64("abc"));
  218. // System.out.println(md5EncryptAndBase64("中"));
  219. }
  220. //-----------顺丰快递验证码加密的相关方法------------------END
  221. }