| package com.jilongda.common.wxPay.payments.jsapi; | 
|   | 
| import com.wechat.pay.java.core.Config; | 
| import com.wechat.pay.java.core.cipher.Signer; | 
| import com.wechat.pay.java.core.exception.HttpException; | 
| import com.wechat.pay.java.core.exception.MalformedMessageException; | 
| import com.wechat.pay.java.core.exception.ServiceException; | 
| import com.wechat.pay.java.core.exception.ValidationException; | 
| import com.wechat.pay.java.core.http.HostName; | 
| import com.wechat.pay.java.core.http.HttpClient; | 
| import com.wechat.pay.java.core.util.NonceUtil; | 
| import com.wechat.pay.java.service.payments.jsapi.JsapiService; | 
| import com.wechat.pay.java.service.payments.jsapi.model.CloseOrderRequest; | 
| import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest; | 
| import com.wechat.pay.java.service.payments.jsapi.model.PrepayWithRequestPaymentResponse; | 
| import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByIdRequest; | 
| import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByOutTradeNoRequest; | 
| import com.wechat.pay.java.service.payments.model.Transaction; | 
| import java.time.Instant; | 
| import org.slf4j.Logger; | 
| import org.slf4j.LoggerFactory; | 
|   | 
| /** | 
|  * JSAPI 支付的扩展类。 | 
|  * | 
|  * <p>它封装了 JsapiService,并提供了一个增强的 JSAPI 下单方法 prepayWithRequestPayment。 | 
|  */ | 
| public class JsapiServiceExtension { | 
|   private final Signer signer; | 
|   private final String signType; | 
|   private final com.wechat.pay.java.service.payments.jsapi.JsapiService jsapiService; | 
|   private static final Logger logger = LoggerFactory.getLogger(JsapiServiceExtension.class); | 
|   | 
|   private JsapiServiceExtension( | 
|       Config config, HttpClient httpClient, HostName hostName, String signType) { | 
|     this.signer = config.createSigner(); | 
|     com.wechat.pay.java.service.payments.jsapi.JsapiService.Builder builder = new JsapiService.Builder().config(config); | 
|     this.signType = signType; | 
|     if (httpClient != null) { | 
|       builder.httpClient(httpClient); | 
|     } | 
|     if (hostName != null) { | 
|       builder.hostName(hostName); | 
|     } | 
|     this.jsapiService = builder.build(); | 
|   } | 
|   /** | 
|    * JSAPI 支付下单,并返回 JSAPI 调起支付数据。推荐使用! | 
|    * | 
|    * <p>请求成功后,该方法返回预支付交易会话标识 prepay_id 和客户端 JSAPI 调起支付所需参数。 它相比 JsApiService.prepay | 
|    * 更简单易用,因为无需开发者自行计算调起支付签名。 | 
|    * | 
|    * @param request 请求参数 | 
|    * @return PrepayWithRequestPaymentResponse | 
|    * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 | 
|    * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 | 
|    * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 | 
|    * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 | 
|    */ | 
|   public PrepayWithRequestPaymentResponse prepayWithRequestPayment(PrepayRequest request) { | 
|     String prepayId = jsapiService.prepay(request).getPrepayId(); | 
|     long timestamp = Instant.now().getEpochSecond(); | 
|     String nonceStr = NonceUtil.createNonce(32); | 
|     String packageVal = "prepay_id=" + prepayId; | 
|     String message = | 
|         request.getAppid() + "\n" + timestamp + "\n" + nonceStr + "\n" + packageVal + "\n"; | 
|     logger.debug("Message for RequestPayment signatures is[{}]", message); | 
|     String sign = signer.sign(message).getSign(); | 
|     PrepayWithRequestPaymentResponse response = new PrepayWithRequestPaymentResponse(); | 
|     response.setAppId(request.getAppid()); | 
|     response.setTimeStamp(String.valueOf(timestamp)); | 
|     response.setNonceStr(nonceStr); | 
|     response.setPackageVal(packageVal); | 
|     response.setSignType(signType); | 
|     response.setPaySign(sign); | 
|     return response; | 
|   } | 
|   /** | 
|    * 微信支付订单号查询订单 | 
|    * | 
|    * @param request 请求参数 | 
|    * @return Transaction | 
|    * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 | 
|    * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 | 
|    * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 | 
|    * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 | 
|    */ | 
|   public Transaction queryOrderById(QueryOrderByIdRequest request) { | 
|     return jsapiService.queryOrderById(request); | 
|   } | 
|   /** | 
|    * 商户订单号查询订单 | 
|    * | 
|    * @param request 请求参数 | 
|    * @return Transaction | 
|    * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 | 
|    * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 | 
|    * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 | 
|    * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 | 
|    */ | 
|   public Transaction queryOrderByOutTradeNo(QueryOrderByOutTradeNoRequest request) { | 
|     return jsapiService.queryOrderByOutTradeNo(request); | 
|   } | 
|   /** | 
|    * 关闭订单 | 
|    * | 
|    * @param request 请求参数 | 
|    * @throws HttpException 发送HTTP请求失败。例如构建请求参数失败、发送请求失败、I/O错误等。包含请求信息。 | 
|    * @throws ValidationException 发送HTTP请求成功,验证微信支付返回签名失败。 | 
|    * @throws ServiceException 发送HTTP请求成功,服务返回异常。例如返回状态码小于200或大于等于300。 | 
|    * @throws MalformedMessageException 服务返回成功,content-type不为application/json、解析返回体失败。 | 
|    */ | 
|   public void closeOrder(CloseOrderRequest request) { | 
|     jsapiService.closeOrder(request); | 
|   } | 
|   | 
|   public static class Builder { | 
|     private Config config; | 
|     private HttpClient httpClient; | 
|     private HostName hostName; | 
|     private String signType; | 
|   | 
|     public Builder config(Config config) { | 
|       this.config = config; | 
|       return this; | 
|     } | 
|   | 
|     public Builder httpClient(HttpClient httpClient) { | 
|       this.httpClient = httpClient; | 
|       return this; | 
|     } | 
|   | 
|     public Builder hostName(HostName hostName) { | 
|       this.hostName = hostName; | 
|       return this; | 
|     } | 
|   | 
|     public Builder signType(String signType) { | 
|       this.signType = signType; | 
|       return this; | 
|     } | 
|   | 
|     public JsapiServiceExtension build() { | 
|       return new JsapiServiceExtension( | 
|           config, httpClient, hostName, signType == null ? "RSA" : signType); | 
|     } | 
|   } | 
| } |