|  |  |  | 
|---|
|  |  |  | import cc.mrbird.febs.common.properties.XcxProperties; | 
|---|
|  |  |  | import cc.mrbird.febs.common.utils.AppContants; | 
|---|
|  |  |  | import cc.mrbird.febs.common.utils.SpringContextHolder; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.entity.MallInvoice; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.entity.MallOrderInfo; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.entity.MallOrderItem; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.mapper.MallInvoiceMapper; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; | 
|---|
|  |  |  | import cc.mrbird.febs.mall.mapper.MallOrderItemMapper; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.model.FPCertificateVo; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.model.FPCertificates; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.model.FPEncryptCertificate; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.service.WxFaPiaoService; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.util.JCEUtil; | 
|---|
|  |  |  | import cc.mrbird.febs.pay.util.RandomStringGenerator; | 
|---|
|  |  |  | import cn.hutool.core.collection.CollUtil; | 
|---|
|  |  |  | import cn.hutool.core.util.ObjectUtil; | 
|---|
|  |  |  | import cn.hutool.json.JSONObject; | 
|---|
|  |  |  | import cn.hutool.json.JSONUtil; | 
|---|
|  |  |  | 
|---|
|  |  |  | import lombok.RequiredArgsConstructor; | 
|---|
|  |  |  | import lombok.extern.slf4j.Slf4j; | 
|---|
|  |  |  | import okhttp3.HttpUrl; | 
|---|
|  |  |  | import org.apache.commons.httpclient.HttpClient; | 
|---|
|  |  |  | import org.apache.commons.httpclient.methods.GetMethod; | 
|---|
|  |  |  | import org.apache.http.HttpEntity; | 
|---|
|  |  |  | import org.apache.http.HttpResponse; | 
|---|
|  |  |  | import org.apache.http.client.methods.CloseableHttpResponse; | 
|---|
|  |  |  | import org.apache.http.client.methods.HttpGet; | 
|---|
|  |  |  | import org.apache.http.client.methods.HttpPatch; | 
|---|
|  |  |  | 
|---|
|  |  |  | public class WxFaPiaoServiceImpl implements WxFaPiaoService { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private final MallOrderInfoMapper mallOrderInfoMapper; | 
|---|
|  |  |  | private final MallOrderItemMapper mallOrderItemMapper; | 
|---|
|  |  |  | private final MallInvoiceMapper mallInvoiceMapper; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private final XcxProperties xcxProperties = SpringContextHolder.getBean(XcxProperties.class); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | log.info("获取到的body信息:" + body); | 
|---|
|  |  |  | //应对签名探测流量 | 
|---|
|  |  |  | if(signature.contains("WECHATPAY/SIGNTEST")){ | 
|---|
|  |  |  | map.put("code","500"); | 
|---|
|  |  |  | map.put("code",500); | 
|---|
|  |  |  | map.put("message", "失败"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | log.info("微信电子发票回调接口....resource解密-JSONObject:"+parseObj); | 
|---|
|  |  |  | String fapiao_apply_id = parseObj.getStr("fapiao_apply_id"); | 
|---|
|  |  |  | log.info("微信电子发票回调接口....resource解密-fapiao_apply_id:"+fapiao_apply_id); | 
|---|
|  |  |  | MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectByOrderNo(fapiao_apply_id); | 
|---|
|  |  |  | MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectBypayOrderNo(fapiao_apply_id); | 
|---|
|  |  |  | if(ObjectUtil.isEmpty(mallOrderInfo)){ | 
|---|
|  |  |  | map.put("code",404); | 
|---|
|  |  |  | map.put("message", "订单不存在"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if(ObjectUtil.isNotEmpty(mallOrderInfo)){ | 
|---|
|  |  |  | //更新订单状态 | 
|---|
|  |  |  | //                        mallOrderInfo.setIsInvoice(1); | 
|---|
|  |  |  | //                        mallOrderInfoMapper.updateById(mallOrderInfo); | 
|---|
|  |  |  | //获取用户的抬头信息 | 
|---|
|  |  |  | String userInvoiceInfo = this.getUserInvoiceInfo(fapiao_apply_id); | 
|---|
|  |  |  | JSONObject userInvoiceInfoJson = JSONUtil.parseObj(userInvoiceInfo); | 
|---|
|  |  |  | //查看当前订单是否已经开具发票 | 
|---|
|  |  |  | Long memberId = mallOrderInfo.getMemberId(); | 
|---|
|  |  |  | String payOrderNo = mallOrderInfo.getPayOrderNo(); | 
|---|
|  |  |  | List<MallInvoice> mallInvoices = mallInvoiceMapper.selectByFapiaoApplyIdAndMemberId(fapiao_apply_id, mallOrderInfo.getMemberId()); | 
|---|
|  |  |  | if(CollUtil.isEmpty(mallInvoices)){ | 
|---|
|  |  |  | MallInvoice mallInvoice = new MallInvoice(); | 
|---|
|  |  |  | mallInvoice.setMemberId(memberId); | 
|---|
|  |  |  | mallInvoice.setFapiaoApplyId(payOrderNo); | 
|---|
|  |  |  | mallInvoice.setOrderNo(mallOrderInfo.getOrderNo()); | 
|---|
|  |  |  | mallInvoice.setOrderId(mallOrderInfo.getId()); | 
|---|
|  |  |  | mallInvoice.setStatus(mallOrderInfo.getStatus()); | 
|---|
|  |  |  | mallInvoice.setAmount(mallOrderInfo.getAmount()); | 
|---|
|  |  |  | List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(mallOrderInfo.getId()); | 
|---|
|  |  |  | mallInvoice.setGoodsImg(mallOrderItemList.get(0).getSkuImage()); | 
|---|
|  |  |  | mallInvoice.setState(1); | 
|---|
|  |  |  | mallInvoice.setType(userInvoiceInfoJson.getStr("type")); | 
|---|
|  |  |  | mallInvoice.setName(userInvoiceInfoJson.getStr("name")); | 
|---|
|  |  |  | mallInvoice.setTaxpayerId(userInvoiceInfoJson.getStr("taxpayer_id")); | 
|---|
|  |  |  | mallInvoice.setAddress(userInvoiceInfoJson.getStr("address")); | 
|---|
|  |  |  | mallInvoice.setTelephone(userInvoiceInfoJson.getStr("telephone")); | 
|---|
|  |  |  | mallInvoice.setBankName(userInvoiceInfoJson.getStr("bank_name")); | 
|---|
|  |  |  | mallInvoice.setBankAccount(userInvoiceInfoJson.getStr("bank_account")); | 
|---|
|  |  |  | mallInvoiceMapper.insert(mallInvoice); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | MallInvoice mallInvoice = mallInvoices.get(0); | 
|---|
|  |  |  | if(2 != mallInvoice.getState()){ | 
|---|
|  |  |  | mallInvoice.setState(1); | 
|---|
|  |  |  | mallInvoice.setType(userInvoiceInfoJson.getStr("type")); | 
|---|
|  |  |  | mallInvoice.setName(userInvoiceInfoJson.getStr("name")); | 
|---|
|  |  |  | mallInvoice.setTaxpayerId(userInvoiceInfoJson.getStr("taxpayer_id")); | 
|---|
|  |  |  | mallInvoice.setAddress(userInvoiceInfoJson.getStr("address")); | 
|---|
|  |  |  | mallInvoice.setTelephone(userInvoiceInfoJson.getStr("telephone")); | 
|---|
|  |  |  | mallInvoice.setBankName(userInvoiceInfoJson.getStr("bank_name")); | 
|---|
|  |  |  | mallInvoice.setBankAccount(userInvoiceInfoJson.getStr("bank_account")); | 
|---|
|  |  |  | mallInvoiceMapper.updateById(mallInvoice); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //省略查询订单 | 
|---|
|  |  |  | //此处处理业务 | 
|---|
|  |  |  | map.put("code","SUCCESS"); | 
|---|
|  |  |  | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("code","RESOURCE_NOT_EXISTS"); | 
|---|
|  |  |  | map.put("code",404); | 
|---|
|  |  |  | map.put("message", "订单不存在"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | }catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | map.put("code","500"); | 
|---|
|  |  |  | map.put("code",500); | 
|---|
|  |  |  | map.put("message", "失败"); | 
|---|
|  |  |  | return map; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取用户的抬头信息 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public String getUserInvoiceInfo(String fapiaoApplyId) throws IOException { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //初始化请求参数 | 
|---|
|  |  |  | Map<String, Object> params = new HashMap<>(); | 
|---|
|  |  |  | params.put("scene","WITH_WECHATPAY"); | 
|---|
|  |  |  | //        params.put("fapiao_apply_id","4200002070202401175245187105"); | 
|---|
|  |  |  | params.put("fapiao_apply_id",fapiaoApplyId); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String baseUrl = "https://api.mch.weixin.qq.com"; | 
|---|
|  |  |  | String canonicalUrl = "/v3/new-tax-control-fapiao/user-title"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | String urlparm = baseUrl+canonicalUrl;//有参数的get请求,加密是需要把参数加载进去URL | 
|---|
|  |  |  | List<BasicNameValuePair> parameters = new ArrayList<>(); | 
|---|
|  |  |  | for (Map.Entry<String, Object> entry : params.entrySet()) { | 
|---|
|  |  |  | parameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | StringBuilder dataparm = new StringBuilder(); | 
|---|
|  |  |  | params.forEach((k, v) -> dataparm.append("&" + k + "=" + v)); | 
|---|
|  |  |  | String string = dataparm.toString(); | 
|---|
|  |  |  | if (!"".equals(string)) { | 
|---|
|  |  |  | urlparm = baseUrl+canonicalUrl + "?" + dataparm.substring(1); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | PrivateKey privateKey = this.getPrivateKeyV3(); | 
|---|
|  |  |  | String postStr = null; | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | postStr = this.createAuthorization( | 
|---|
|  |  |  | "GET", | 
|---|
|  |  |  | urlparm, | 
|---|
|  |  |  | "", | 
|---|
|  |  |  | privateKey | 
|---|
|  |  |  | ); | 
|---|
|  |  |  | } catch (NoSuchAlgorithmException e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return this.sendGet(baseUrl+canonicalUrl, params, "WECHATPAY2-SHA256-RSA2048 "+postStr); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 验证签名 | 
|---|