You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					443 lines
				
				20 KiB
			
		
		
			
		
	
	
					443 lines
				
				20 KiB
			| 
											3 years ago
										 | package com.ynxbd.wx.wxfactory.medical;
 | ||
|  | 
 | ||
|  | import com.alibaba.fastjson.JSON;
 | ||
|  | import com.alibaba.fastjson.JSONObject;
 | ||
|  | import com.ynxbd.common.helper.common.DateHelper;
 | ||
|  | import com.ynxbd.common.helper.common.ErrorHelper;
 | ||
|  | import com.ynxbd.common.helper.common.JsonHelper;
 | ||
|  | import com.ynxbd.common.helper.http.OkHttpHelper;
 | ||
|  | import com.ynxbd.common.result.JsonResult;
 | ||
|  | import com.ynxbd.wx.wxfactory.WxFactory;
 | ||
|  | import com.ynxbd.wx.wxfactory.bean.*;
 | ||
|  | import com.ynxbd.wx.wxfactory.utils.WxRequestHelper;
 | ||
|  | import com.ynxbd.wx.wxfactory.utils.WxSignHelper;
 | ||
|  | import lombok.NoArgsConstructor;
 | ||
|  | import lombok.extern.slf4j.Slf4j;
 | ||
|  | import org.apache.commons.codec.digest.DigestUtils;
 | ||
|  | 
 | ||
|  | import java.math.BigDecimal;
 | ||
|  | import java.util.Date;
 | ||
|  | import java.util.HashMap;
 | ||
|  | import java.util.Map;
 | ||
|  | import java.util.UUID;
 | ||
|  | 
 | ||
|  | @Slf4j
 | ||
|  | @NoArgsConstructor
 | ||
|  | public class Client {
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 免密授权地址
 | ||
|  |      *
 | ||
|  |      * @param url url
 | ||
|  |      */
 | ||
|  |     public String getAuthUrl(String url) {
 | ||
|  |         return MdConfig.getConfigUrl(url);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 微信医保下单
 | ||
|  |      *
 | ||
|  |      * @param orderTypeEnum
 | ||
|  |      * @param accessToken
 | ||
|  |      * @param appId
 | ||
|  |      * @param mchId
 | ||
|  |      * @param mdPayKey
 | ||
|  |      * @param cityCode
 | ||
|  |      * @param hospitalName
 | ||
|  |      * @param orgNo
 | ||
|  |      * @param channel
 | ||
|  |      * @param openid
 | ||
|  |      * @param payAuthNo
 | ||
|  |      * @param payOrdId
 | ||
|  |      * @param outTradeNo
 | ||
|  |      * @param serialNo
 | ||
|  |      * @param totalFee
 | ||
|  |      * @param insuranceFee
 | ||
|  |      * @param cardNo
 | ||
|  |      * @param realName
 | ||
|  |      * @param notifyUrl
 | ||
|  |      * @param callbackUrl
 | ||
|  |      * @param body
 | ||
|  |      * @return
 | ||
|  |      */
 | ||
|  |     public MedicalPayOrder createOrder(OrderTypeEnum orderTypeEnum, String accessToken,
 | ||
|  |                                        String appId, String mchId, String mdPayKey,
 | ||
|  |                                        String cityCode, String hospitalName, String orgNo, String channel,
 | ||
|  |                                        String openid, String payAuthNo, String payOrdId,
 | ||
|  |                                        String outTradeNo, String serialNo,
 | ||
|  |                                        BigDecimal totalFee, BigDecimal insuranceFee, BigDecimal cashFee,
 | ||
|  |                                        String cardNo, String realName, String ip,
 | ||
|  |                                        String notifyUrl, String callbackUrl, String body, String attach) {
 | ||
|  | 
 | ||
|  |         int payType;
 | ||
|  |         try {
 | ||
|  |             if (cashFee == null) cashFee = new BigDecimal(0);
 | ||
|  | 
 | ||
|  |             if (totalFee.compareTo(insuranceFee) == 0) {
 | ||
|  |                 payType = 2; // 医保
 | ||
|  |             } else if (totalFee.compareTo(cashFee) == 0) {
 | ||
|  |                 payType = 3; // 现金(1)
 | ||
|  |             } else {
 | ||
|  |                 payType = 3; // 医保+现金
 | ||
|  |             }
 | ||
|  |         } catch (Exception e) {
 | ||
|  |             log.error("【医保】金额转换异常: {}", e.getMessage());
 | ||
|  |             return null;
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         try {
 | ||
|  |             BigDecimal finalCashFee = cashFee;
 | ||
|  |             JsonResult jsonResult = WxRequestHelper.postMdXml(("https://api.weixin.qq.com/payinsurance/unifiedorder?access_token=" + accessToken), params -> {
 | ||
|  | 
 | ||
|  |                 params.put("insurance_fee", insuranceFee.movePointRight(2)); // 医保支付金额(分)
 | ||
|  |                 params.put("total_fee", totalFee.movePointRight(2)); // 总金额(分)
 | ||
|  |                 params.put("cash_fee", finalCashFee.movePointRight(2)); // 现金需要支付的金额 { 单位为分>=0 线上预结算模式金额填0; 线下预结算模式填实际自费金额 }
 | ||
|  |                 params.put("pay_type", payType); // 支付方式-医保 (1:现金 2:医保 3:现金+医保)
 | ||
|  | 
 | ||
|  |                 params.put("order_type", orderTypeEnum.CODE);
 | ||
|  |                 params.put("appid", appId);
 | ||
|  |                 params.put("mch_id", mchId);
 | ||
|  |                 params.put("openid", openid);
 | ||
|  | 
 | ||
|  |                 params.put("hosp_out_trade_no", outTradeNo); // 第三方服务商订单号 outTradeNo
 | ||
|  |                 params.put("serial_no", serialNo); // 医院HIS系统订单号
 | ||
|  | 
 | ||
|  |                 params.put("body", body); // 商品描述
 | ||
|  |                 params.put("notify_url", notifyUrl); // 回调接口
 | ||
|  |                 params.put("return_url", callbackUrl); // 回调页面
 | ||
|  |                 params.put("attach", attach); // 附加数据
 | ||
|  | 
 | ||
|  |                 // 使用医保支付时必填
 | ||
|  |                 params.put("user_card_type", 1); // 证件类型
 | ||
|  |                 params.put("city_id", cityCode); // 城市编码
 | ||
|  |                 params.put("user_name", realName); // 真实姓名
 | ||
|  |                 params.put("user_card_no", DigestUtils.md5Hex(cardNo)); // 证件号码
 | ||
|  | 
 | ||
|  |                 //==========================================================
 | ||
|  |                 params.put("hospital_name", hospitalName); //
 | ||
|  |                 //=========================================================
 | ||
|  | 
 | ||
|  |                 params.put("allow_fee_change", 1); // 是否允许预结算费用发生变化 {0:不允许  1:允许 当医保局返回的预结算金额与医院上传的金额不一致时,此字段为0则直接报错,为1则以医保局金额为准}
 | ||
|  |                 params.put("spbill_create_ip", ip); // 客户端ip
 | ||
|  | 
 | ||
|  |                 // 使用医保支付时必填
 | ||
|  |                 params.put("is_dept", "4"); // 医保标识
 | ||
|  |                 params.put("org_no", orgNo); // 医疗机构编码(医保局分配给机构)
 | ||
|  |                 params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
 | ||
|  |                 params.put("gmt_out_create", DateHelper.dateToStr(new Date(), DateHelper.DateEnum.yyyyMMddHHmmss)); // 医院下单时间
 | ||
|  | 
 | ||
|  | 
 | ||
|  |                 Map<String, String> requestContent = new HashMap<>();
 | ||
|  |                 requestContent.put("payAuthNo", payAuthNo);  // 授权码
 | ||
|  |                 requestContent.put("payOrdId", payOrdId);      // 处方号
 | ||
|  |                 requestContent.put("setlLatlnt", "0,0");     // 经纬度"118.096435,24.485407"。未获取到用户定位时,传“0,0”。
 | ||
|  | 
 | ||
|  |                 params.put("request_content", JsonHelper.toJsonString(requestContent));
 | ||
|  |                 params.put("channel_no", channel); // 渠道号
 | ||
|  |                 //----------------------------------------------------------------
 | ||
|  |                 params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
 | ||
|  |                 log.info("[医保][下单] req={}", JsonHelper.toJsonString(params));
 | ||
|  |             });
 | ||
|  | 
 | ||
|  |             log.info("[医保][下单] resp={}", JsonHelper.toJsonString(jsonResult));
 | ||
|  |             if (!jsonResult.success()) {
 | ||
|  |                 return new MedicalPayOrder().createResult(jsonResult);
 | ||
|  |             }
 | ||
|  |             return jsonResult.dataMapToBean(MedicalPayOrder.class);
 | ||
|  |         } catch (Exception e) {
 | ||
|  |             ErrorHelper.println(e);
 | ||
|  |         }
 | ||
|  |         return null;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     public MedicalOrder queryOrder(String accessToken, String appId, String mchId, String mdPayKey, String outTradeNo, String medTransId) {
 | ||
|  |         JsonResult jsonResult = WxRequestHelper.postMdXml(("https://api.weixin.qq.com/payinsurance/queryorder?access_token=" + accessToken), params -> {
 | ||
|  |             params.put("appid", appId);
 | ||
|  |             params.put("mch_id", mchId);
 | ||
|  |             // 二选一
 | ||
|  |             params.put("hosp_out_trade_no", outTradeNo); // 第三方服务商订单号 outTradeNo
 | ||
|  | //            params.put("med_trans_id", medTransId); // 微信生成的医疗订单号
 | ||
|  |             params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
 | ||
|  | 
 | ||
|  |             params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
 | ||
|  |             log.info("[医保][查询订单] req={}", JsonHelper.toJsonString(params));
 | ||
|  |         });
 | ||
|  |         if (!jsonResult.success()) {
 | ||
|  |             return new MedicalOrder().createResult(jsonResult);
 | ||
|  |         }
 | ||
|  |         log.info("[医保][查询订单] req={}", JsonHelper.toJsonString(jsonResult));
 | ||
|  |         return jsonResult.dataMapToBean(MedicalOrder.class);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * [医保]退费(注意:需要先退医保部分,才能退现金部分)
 | ||
|  |      *
 | ||
|  |      * @param accessToken accessToken
 | ||
|  |      * @param appId       appId
 | ||
|  |      * @param mchId       mchId
 | ||
|  |      * @param mdPayKey    mdPayKey
 | ||
|  |      * @param outTradeNo  订单号
 | ||
|  |      * @param outRefundNo 退费订单号
 | ||
|  |      * @param payOrdId    医保订单号
 | ||
|  |      * @param cashFee     退费现金
 | ||
|  |      * @param reason      退费原因
 | ||
|  |      */
 | ||
|  |     public MedicalOrder refund(String accessToken, String appId, String mchId, String mdPayKey, String outTradeNo, String outRefundNo, String payOrdId, BigDecimal cashFee, String reason) {
 | ||
|  |         if (reason == null) {
 | ||
|  |             reason = "申请退款";
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         if (cashFee == null || cashFee.compareTo(BigDecimal.ZERO) == 0) {
 | ||
|  |             return new MedicalRefund().createResult("退费金额错误或为0禁止退费");
 | ||
|  |         }
 | ||
|  |         String finalReason = reason;
 | ||
|  |         JsonResult jsonResult = WxRequestHelper.postMdXml(("https://api.weixin.qq.com/payinsurance/refund?access_token=" + accessToken), params -> {
 | ||
|  |             params.put("appid", appId);
 | ||
|  |             params.put("mch_id", mchId);
 | ||
|  |             // 二选一
 | ||
|  |             params.put("hosp_out_trade_no", outTradeNo); // 第三方服务商订单号 outTradeNo
 | ||
|  |             //            params.put("med_trans_id", medTransId); // 微信生成的医疗订单号
 | ||
|  | 
 | ||
|  |             params.put("hosp_out_refund_no", outRefundNo); // 退费订单号
 | ||
|  |             params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
 | ||
|  | 
 | ||
|  | 
 | ||
|  |             JSONObject requestContent = new JSONObject();
 | ||
|  |             requestContent.put("ref_reason", finalReason);
 | ||
|  |             requestContent.put("payOrdId", payOrdId);
 | ||
|  |             params.put("request_content", JSON.toJSONString(requestContent));
 | ||
|  | 
 | ||
|  | //            /**
 | ||
|  | //             * 1、不填则全退,CASH_ONLY则只退现金部分;
 | ||
|  | //             * 2、INS_ONLY:为全额退医保部分(统筹+个账),如果订单已经单独退了统筹部分则不再支持医保部分全额退款;
 | ||
|  | //             * 3、INS_PLAN_PART:为只退医保统筹部分,当前统筹部分仅支持一次性退款;
 | ||
|  | //             * 4、INS_INDIVIDUAL_PART:为只退医保个账部分,个账部分支持多次退款。
 | ||
|  | //             * 现金跟医保可以分开退款,医保部分统筹和个账部分也可以分开退,需要填写不同的hosp_out_refund_no参数
 | ||
|  | //             */
 | ||
|  | //            params.put("part_refund_type", "INS_ONLY"); // 部分退款
 | ||
|  | //            /**
 | ||
|  | //             * 不填默认全退,填写金额时则指定金额不能为0;该参数只在part_refund_type为INS_INDIVIDUAL_PART生效
 | ||
|  | //             */
 | ||
|  | //            params.put("ins_refund_fee", new BigDecimal(refundFee).movePointRight(2)); // 个账部分退款
 | ||
|  | 
 | ||
|  |             params.put("cash_refund_fee", cashFee.movePointRight(2).intValue()); // 现金退款
 | ||
|  | 
 | ||
|  | 
 | ||
|  |             // 医保退款必须------------------------------------------------
 | ||
|  |             params.put("cancel_bill_no", outRefundNo);   // 撤销单据号
 | ||
|  |             params.put("cancel_serial_no", outRefundNo); // 撤销流水号
 | ||
|  | 
 | ||
|  |             params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
 | ||
|  |             log.info("[医保][退费] req={}", JsonHelper.toJsonString(params));
 | ||
|  |         });
 | ||
|  | 
 | ||
|  |         log.info("[医保][退费] resp={}", JsonHelper.toJsonString(jsonResult));
 | ||
|  |         if (!jsonResult.success()) {
 | ||
|  |             return new MedicalRefund().createResult(jsonResult);
 | ||
|  |         }
 | ||
|  |         return jsonResult.dataMapToBean(MedicalOrder.class);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * [医保]查询退费
 | ||
|  |      *
 | ||
|  |      * @param accessToken accessToken
 | ||
|  |      * @param appId       appId
 | ||
|  |      * @param mchId       mchId
 | ||
|  |      * @param mdPayKey    mdPayKey
 | ||
|  |      */
 | ||
|  |     public MedicalRefundInfo queryRefund(String accessToken, String appId, String mchId, String mdPayKey, String outTradeNo, String medTransId) {
 | ||
|  | 
 | ||
|  |         JsonResult jsonResult = WxRequestHelper.postMdXml(("https://api.weixin.qq.com/payinsurance/queryrefund?access_token=" + accessToken), params -> {
 | ||
|  |             params.put("appid", appId);
 | ||
|  |             params.put("mch_id", mchId);
 | ||
|  |             // 二选一
 | ||
|  |             if (outTradeNo != null) {
 | ||
|  |                 params.put("hosp_out_trade_no", outTradeNo); // 第三方服务商订单号 outTradeNo
 | ||
|  |             }
 | ||
|  |             if (medTransId != null) {
 | ||
|  |                 params.put("med_trans_id", medTransId); // 微信生成的医疗订单号
 | ||
|  |             }
 | ||
|  |             params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
 | ||
|  | 
 | ||
|  |             params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
 | ||
|  | 
 | ||
|  |             log.info("[医保][查询退费] req={}", JsonHelper.toJsonString(params));
 | ||
|  |         });
 | ||
|  |         if (!jsonResult.success()) {
 | ||
|  |             return new MedicalRefundInfo().createResult(jsonResult);
 | ||
|  |         }
 | ||
|  |         return jsonResult.dataMapToBean(MedicalRefundInfo.class);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * [医保]下载对账账单
 | ||
|  |      *
 | ||
|  |      * @param accessToken accessToken
 | ||
|  |      * @param appId       appId
 | ||
|  |      * @param mchId       mchId
 | ||
|  |      * @param mdPayKey    mdPayKey
 | ||
|  |      * @param billDate    对账单日期(yyyyMMdd)
 | ||
|  |      * @param billType    帐单类型 (ALL,返回当日所有订单信息;默认值 SUCCESS,返回当日成功支付的订单;REFUND,返回当日退款订单)
 | ||
|  |      */
 | ||
|  |     public MedicalOrder downBill(String accessToken, String appId, String mchId, String mdPayKey, String billDate, String billType) {
 | ||
|  | 
 | ||
|  |         JsonResult jsonResult = WxRequestHelper.postMdXml(("https://api.weixin.qq.com/payinsurance/billdownload?access_token=" + accessToken), params -> {
 | ||
|  |             params.put("appid", appId);
 | ||
|  |             params.put("mch_id", mchId);
 | ||
|  |             //
 | ||
|  |             params.put("bill_date", billDate);
 | ||
|  |             params.put("bill_type", billType);
 | ||
|  | 
 | ||
|  |             params.put("nonce_str", UUID.randomUUID().toString().replaceAll("-", ""));
 | ||
|  |             params.put("sign", WxSignHelper.generateSign(params, WxSignHelper.SIGN_TYPE_MD5, mdPayKey));
 | ||
|  |             log.info("[医保][账单下载] req={}", JsonHelper.toJsonString(params));
 | ||
|  |         });
 | ||
|  | 
 | ||
|  |         if (!jsonResult.success()) {
 | ||
|  |             return new MedicalRefund().createResult(jsonResult);
 | ||
|  |         }
 | ||
|  |         log.info("[医保][账单下载] resp={}", JsonHelper.toJsonString(jsonResult));
 | ||
|  |         return jsonResult.dataMapToBean(MedicalOrder.class);
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /**
 | ||
|  |      * 获取用户授权码等信息(注意:联系腾讯修改白名单后,调用接口会报授权码错误的提示,需切换请求路径)
 | ||
|  |      *
 | ||
|  |      * @param reqUrl 请求地址
 | ||
|  |      * @param openid openid
 | ||
|  |      * @param qrcode 用户授权码
 | ||
|  |      * @return 用户信息
 | ||
|  |      */
 | ||
|  |     public MedicalUserInfo getUserInfo(String reqUrl, String openid, String qrcode) {
 | ||
|  |         MedicalUserInfo info = new MedicalUserInfo();
 | ||
|  |         String timestamp = Long.toString(System.currentTimeMillis());
 | ||
|  | 
 | ||
|  |         String signature = MdConfig.createSignature(timestamp);
 | ||
|  |         if (signature == null) {
 | ||
|  |             info.setMessage("signature签名错误");
 | ||
|  |             return info;
 | ||
|  |         }
 | ||
|  |         JSONObject respJson = OkHttpHelper.postForm(reqUrl, params -> {
 | ||
|  |             params.put("qrcode", qrcode);
 | ||
|  |             params.put("openid", openid);
 | ||
|  |             log.info("[医保][授权] req={}", JsonHelper.toJsonString(params));
 | ||
|  |         }, headers -> {
 | ||
|  |             headers.set("Accept", "application/json");
 | ||
|  |             headers.set("Content-Type", "application/json");
 | ||
|  |             //
 | ||
|  |             headers.set("god-portal-timestamp", timestamp);
 | ||
|  |             headers.set("god-portal-signature", signature);
 | ||
|  |             headers.set("god-portal-request-id", UUID.randomUUID().toString().replaceAll("-", ""));
 | ||
|  |         });
 | ||
|  |         if (respJson == null) {
 | ||
|  |             info.setMessage("请求用户信息失败");
 | ||
|  |             return info;
 | ||
|  |         }
 | ||
|  |         String code = respJson.getString("code");
 | ||
|  |         String message = respJson.getString("message");
 | ||
|  |         if (!"0".equals(code)) {
 | ||
|  |             log.error("[医保授权]失败 resp={}", respJson);
 | ||
|  | 
 | ||
|  |             info.setMessage(String.format("[%s] %s", code, message));
 | ||
|  |             return info;
 | ||
|  |         }
 | ||
|  | 
 | ||
|  | 
 | ||
|  |         JSONObject longitudeLatitude = respJson.getJSONObject("user_longitude_latitude");
 | ||
|  |         if (longitudeLatitude == null) {
 | ||
|  |             info.setMessage(String.format("[%s] %s, tip=%s", code, message, "经纬度异常"));
 | ||
|  |             return info;
 | ||
|  |         }
 | ||
|  |         String longitude = longitudeLatitude.getString("longitude");
 | ||
|  |         String latitude = longitudeLatitude.getString("latitude");
 | ||
|  | 
 | ||
|  |         String userName = respJson.getString("user_name");
 | ||
|  |         String payAuthNo = respJson.getString("pay_auth_no");
 | ||
|  |         String cardNo = respJson.getString("user_card_no");
 | ||
|  |         if (cardNo != null && !"".equals(cardNo)) {
 | ||
|  |             info.setCardNo(cardNo);
 | ||
|  |             respJson.remove("user_card_no");
 | ||
|  |         }
 | ||
|  | 
 | ||
|  |         log.error("[医保授权]返回 resp={}", respJson);
 | ||
|  | 
 | ||
|  |         info.setUserName(userName);
 | ||
|  |         info.setPayAuthNo(payAuthNo);
 | ||
|  |         info.setLongitude(longitude);
 | ||
|  |         info.setLatitude(latitude);
 | ||
|  |         info.setSuccess(true);
 | ||
|  |         return info;
 | ||
|  |     }
 | ||
|  | 
 | ||
|  |     public static void main(String[] args) {
 | ||
|  |         WxFactory.Medical.Common().getUserInfo("http://www.baidu.com", "123", "222");
 | ||
|  | 
 | ||
|  | //        WxFactory.Medical.Common().downBill("", "", "", "", "", "");
 | ||
|  |     }
 | ||
|  | 
 | ||
|  | //    public static void main(String[] args) {
 | ||
|  | //        String accessToken = "57_WiWb2k55Xv1Lbj9y0rEW1wFxKzQPiaaFJ4oOdJwYvb2TlGOHgqi4pQt4dLFKv7EqF7939o6jk0d9QAyTKxrSF3rcCVRo73SnSpNGVjYbBlxe7vv7XlGWiax5ApS8Ut5gP-PMU_eIr9W4O5BxXLAgADAIWL";
 | ||
|  | //        String payAuthNo = "AUTH530100202205071850280000014";
 | ||
|  | //        createOrder(OrderTypeEnum.DIAG_PAY, accessToken, "wxd503671f502bd89d", "1288583001", "216677bcfa51be03905c867dd71f2952", "oeso-t62kkoRwLVVkSkwmmjPfUXk", payAuthNo,
 | ||
|  | //                null, null, null, null, null, null, null);
 | ||
|  | //    }
 | ||
|  | 
 | ||
|  | 
 | ||
|  | //    public String getUserInfo(String reqUrl, String openid, String qrcode) {
 | ||
|  | //        Map<String, Object> dataMap = new HashMap<>();
 | ||
|  | //        dataMap.put("qrcode", qrcode);
 | ||
|  | //        dataMap.put("openid", openid);
 | ||
|  | //
 | ||
|  | //        HttpURLConnection conn = null;
 | ||
|  | //        OutputStream os = null;
 | ||
|  | //        try {
 | ||
|  | //            conn = (HttpURLConnection) new URL(reqUrl).openConnection();
 | ||
|  | //            conn.setDoOutput(true);
 | ||
|  | //            conn.setDoInput(true);
 | ||
|  | //            conn.setRequestMethod("POST");
 | ||
|  | //            conn.setUseCaches(false);
 | ||
|  | //            conn.setInstanceFollowRedirects(true);
 | ||
|  | //            conn.setRequestProperty("Content-Type", "application/json");
 | ||
|  | //            conn.setRequestProperty("Accept", "application/json");
 | ||
|  | //            String timestamp = Long.toString(System.currentTimeMillis());
 | ||
|  | //
 | ||
|  | //            String signature = Config.createSignature(timestamp);
 | ||
|  | //
 | ||
|  | //            String requestId = UUID.randomUUID().toString().replaceAll("-", "");
 | ||
|  | //            conn.setRequestProperty("god-portal-timestamp", timestamp);
 | ||
|  | //            conn.setRequestProperty("god-portal-signature", signature);
 | ||
|  | //            conn.setRequestProperty("god-portal-request-id", requestId);
 | ||
|  | //            conn.connect();
 | ||
|  | //
 | ||
|  | //            os = conn.getOutputStream();
 | ||
|  | //            os.write(JsonHelper.toJsonString(dataMap).getBytes());
 | ||
|  | //            os.flush();
 | ||
|  | //            os.close();
 | ||
|  | //            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
 | ||
|  | //            InputStream inputStream = conn.getInputStream();
 | ||
|  | //            byte[] bytes = new byte[1024];
 | ||
|  | //            int readBytes;
 | ||
|  | //            while ((readBytes = inputStream.read(bytes)) != -1) {
 | ||
|  | //                byteArrayOutputStream.write(bytes, 0, readBytes);
 | ||
|  | //            }
 | ||
|  | //            bytes = byteArrayOutputStream.toByteArray();
 | ||
|  | //            inputStream.close();
 | ||
|  | //            conn.disconnect();
 | ||
|  | //            return new String(bytes, StandardCharsets.UTF_8);
 | ||
|  | //        } catch (Exception e) {
 | ||
|  | //            if (conn != null) {
 | ||
|  | //                conn.disconnect();
 | ||
|  | //            }
 | ||
|  | //            e.printStackTrace();
 | ||
|  | //        }
 | ||
|  | //        return null;
 | ||
|  | //    }
 | ||
|  | 
 | ||
|  | }
 |