Wechat applet acceso al pago de wechat

Abrir una cuenta de comerciante

La premisa del pago de WeChat es: después de registrarse en la plataforma de WeChat, debe abrir una cuenta comercial empresarial y debe enviar el certificado de registro comercial, el certificado de apertura de cuenta bancaria empresarial, el código de organización, etc. para su revisión https://pay .weixin.qq.com/index .php/apply/applyment_home/guide_normal

inserte la descripción de la imagen aquí
Después de abrir la cuenta de comerciante, necesitamos obtener la clave, el certificado y otra información relacionada, que se genera de acuerdo con el siguiente documento: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/ capítulo2_8_1.shtml

Mini programa vinculante WeChat Pay

Si no tiene un miniprograma de WeChat, active [Enterprise Edition] primero. Para activar el pago de WeChat para un miniprograma, es decir, solicite o reutilice una cuenta de comerciante de pago de WeChat. Después de solicitar el miniprograma programa, inicie sesión en el fondo del mini-programa. Haga clic en WeChat Pay en la barra de navegación izquierda y actívelo en la página Vincular
inserte la descripción de la imagen aquí
APPID: luego debe agregar el APPID asociado para vincular, el efecto es el siguiente
inserte la descripción de la imagen aquí
Aceptar para autorizar: Vuelva al fondo del subprograma WeChat: busque en el función: WeChat Pay, para aceptar autorizar

SDK de acceso

El pago de WeChat debe preparar los siguientes parámetros, consulte el documento:
https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml

  • APPID del programa WeChat Mini
  • ID de comerciante de pago de WeChat: mercantilId, plataforma de pago de WeChat para obtener
  • Certificado de pago de WeChat: plataforma de pago de WeChat para obtener
  • Número de serie del certificado de comerciante de pago de WeChat: mercantilSerialNumber
  • Clave APIV3 del comerciante de pagos de WeChat: apiV3key

WeChat proporciona un SDK para facilitar nuestro acceso al pago de WeChat:

  • Pautas para el desarrollo de programas pequeños: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_2.shtml,

  • Documento de pago del applet: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml

  • Lista de interfaz de mini programa: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_3.shtml

  • Programa pequeño, referencia de caso de código: https://github.com/wechatpay-apiv3/wechatpay-java/blob/main/service/src/example/java/com/wechat/pay/java/service/payments/jsapi/JsapiServiceExtensionExample .Java

El primer paso, agregamos el paquete Maven provisto por WeChat

<dependencies>
    <dependency>
        <groupId>com.github.wechatpay-apiv3</groupId>
        <artifactId>wechatpay-java</artifactId>
        <version>0.2.8</version>
    </dependency>
    <dependency>
        <groupId>com.github.wechatpay-apiv3</groupId>
        <artifactId>wechatpay-apache-httpclient</artifactId>
        <version>0.4.9</version>
    </dependency>
</dependencies>

Para el pago JSAPI y el pago APP, se recomienda utilizar la clase de extensión de servicio JsapiServiceExtension y AppServiceExtension, las cuales incluyen el método para realizar un pedido y devolver los parámetros de pago. El siguiente es un ejemplo de código de acceso rápido proporcionado por la plataforma WeChat

/** Native 支付下单为例 */
public class QuickStart {
    
    

    public static String appid = "";
    /** 商户号 */
    public static String merchantId = "";
    /** 商户API私钥路径 */
    public static String privateKeyPath = "D:\\itsource\\data\\apiclient_key.pem";
    /** 商户证书序列号 */
    public static String merchantSerialNumber = "";
    /** 商户APIV3密钥 */
    public static String apiV3key = "";

    public static void main(String[] args) {
    
    
        // 使用自动更新平台证书的RSA配置
        // 一个商户号只能初始化一个配置,否则会因为重复的下载任务报错
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(merchantId)
                        .privateKeyFromPath(privateKeyPath)
                        .merchantSerialNumber(merchantSerialNumber)
                        .apiV3Key(apiV3key)
                        .build();
        // 构建service
        JsapiServiceExtension service = new JsapiServiceExtension.Builder().config(config).build();
        // request.setXxx(val)设置所需参数,具体参数可见Request定义
        PrepayRequest request = new PrepayRequest();
        Amount amount = new Amount();
        amount.setTotal(100);
        request.setAmount(amount);

        Payer payer = new Payer();
        //支付者的微信OpenId
        payer.setOpenid("xxxx");
        request.setPayer(payer);
        request.setAppid(appid);
        request.setMchid(merchantId);
        
    	//分账
        SettleInfo settleInfo = new SettleInfo();
        settleInfo.setProfitSharing(true);
        request.setSettleInfo(settleInfo);
        
        request.setDescription("测试商品标题");
        request.setNotifyUrl("https://notify_url");
        request.setOutTradeNo("out_trade_no_001"+ DateFormatUtils.format(new Date(),"HHmmss"));
        // 调用下单方法,得到应答
        PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);
        System.out.println(response);

    }
}

Necesitamos subempaquetar nuestra propia lógica de pago de WeChat y escribir la interfaz del controlador de pago de acuerdo con el caso del código anterior. El applet necesita solicitar la interfaz de pago. Y el valor de retorno se envía a la aplicación en consecuencia. El resultado de PrepayWithRequestPaymentResponse protege los siguientes valores de resultado
● "timeStamp": frotamiento de tiempo
● "nonceStr": cadena aleatoria, no más de 32
caracteres valor del parámetro prepay_id, "prepay_id=xxxx "
● "signType": tipo de firma, el valor predeterminado es RSA, solo se admite RSA
● "paySign": firma, el valor de la firma calculado usando los campos appId, timeStamp, nonceStr y paquete

Pago transferencia mini programa

El applet obtiene los parámetros de pago devueltos por el fondo y luego llama a wx.requestPayment para llamar a WeChat para completar el pago en el componente de pago.

wx.requestPayment({
    
    
      timeStamp: result.timeStamp,
      nonceStr: result.nonceStr,
      package: result.packageVal,
      signType: result.signType,//'MD5',
      paySign: result.paySign,
      success (payRes) {
    
     
          console.log(res);
      },
      fail (error) {
    
    
          console.log(error);
      }
})

Devolución de llamada de resultado de pago de WeChat

Notificación de resultado de pago de WeChat: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_5.shtml

La plataforma de pago de WeChat vuelve a llamar a nuestra interfaz a través de notificar_url para notificarnos el resultado del pago, porque nuestro proyecto está desplegado en la intranet, y si es un entorno en línea, este problema no existe, por lo que esta solicitud no se puede ajustar, necesitamos para hacer la penetración de la intranet Mediante el mapeo de nuestra aplicación a la red externa, para que la plataforma de pago pueda devolvernos la llamada.

Dirección del tutorial de penetración de la intranet de Natapp: https://natapp.cn/article/natapp_newbie, el efecto final es el siguiente: inserte la descripción de la imagen aquí
al acceder a este nombre de dominio es equivalente a acceder: 127.0.0.1:10010, pero se puede acceder a este nombre de dominio desde el red externa

Necesitamos modificar la notificación_url en los parámetros de la solicitud de pago de construcción a la dirección del nombre de dominio: por ejemplo:

request.setNotifyUrl("http://5qsems.natappfree.cc/pay/wx/notify");

Entonces la dirección corresponde a la interfaz del controlador del servicio de pago. Necesitamos escribir la interfaz del controlador de notificación correspondiente, consulte la notificación de pago del applet del documento: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_5.shtml. Según el documento, WeChat utiliza la URL de notificación especificada para notificar el resultado del pago. La notificación del resultado del pago es un método POST para acceder a la URL de notificación establecida por el comerciante. Los datos de la notificación se transmiten a través del cuerpo de la solicitud (BODY) en formato JSON. y los datos de notificación incluyen cifrado Detalles de los resultados de pago para . Necesitamos realizar una verificación de firma en el resultado y descifrar los parámetros antes de realizar el procesamiento comercial.

Para la respuesta de resultado, la recepción es exitosa: el código de estado de respuesta HTTP debe devolver 200 o 204, y no es necesario devolver un mensaje de respuesta. Error al recibir: el código de estado de respuesta HTTP debe devolver 5XX o 4XX, y un mensaje de respuesta debe devolverse al mismo tiempo. El formato es el siguiente:

{
    
      
    "code": "FAIL",
    "message": "失败"
}

Para el procesamiento de la notificación del resultado del pago, puede consultar el caso oficial: https://github.com/wechatpay-apiv3/wechatpay-java, busque la parte de verificación y descifrado de la firma de la notificación de devolución de llamada: Primero
, debe crear un HTTP público en su servidor Endpoint que acepta notificaciones de devolución de llamada de WeChat Pay. Al recibir la notificación de devolución de llamada, use NotificationParser en la notificación para analizar la notificación de devolución de llamada. Los pasos específicos son los siguientes:

  1. Utilice la devolución de llamada para notificar los datos solicitados y construir RequestParam.
    ● Cabecera HTTP Wechatpay-Signature
    ● Cabecera HTTP Wechatpay-Nonce
    ● Cabecera HTTP Wechatpay-Timestamp
    ● Cabecera HTTP Wechatpay-Serial
    ● Cabecera HTTP Wechatpay-Signature-Type
    ● Cuerpo de solicitud HTTP. Recuerde usar el mensaje original en lugar de la cadena serializada del objeto JSON para evitar inconsistencias entre el cuerpo de la verificación de la firma y el texto original.
  2. Inicialice RSAAutoCertificateConfig. El certificado de la plataforma de pago de WeChat es proporcionado por la capacidad de la plataforma de actualización automática del SDK, y también se puede usar un certificado local.
  3. Inicializar NotificationParser.
  4. Llame a NotificationParser.parse() para verificar la firma, descifrar y convertir el JSON en un objeto de devolución de llamada de notificación específico.

Según el caso oficial, escribimos nuestro propio código de interfaz de notificación, de la siguiente manera:
● @RequestHeader Map<String, String> headers: inyecta el encabezado de la solicitud
● HttpServletRequest: obtiene el cuerpo a través del objeto de la solicitud

//支付回调
@PostMapping("/wx/notify")
public WxPayNotifyResult notifyHandler(@RequestHeader Map<String, String> headers,
                                       HttpServletRequest request,
                                       HttpServletResponse response){
    
    
    try{
    
    
    	//1.拿到body中的内容
        BufferedReader reader = request.getReader();
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = reader.readLine()) != null) {
    
    
            stringBuilder.append(line);
        }
        String body = stringBuilder.toString();
        log.info("支付结果通知 {}",body);
        //2.调用微信支付结果处理逻辑
        wxPayService.notifyHandler(body,headers);

        //3.响应码:200代表接受成功,5xx代表代表接受失败
        response.setStatus(HttpServletResponse.SC_OK);
        return WxPayNotifyResult.builder().code("SUCCESS").message("成功").build();
    }catch (Exception e){
    
    
        e.printStackTrace();
        //响应码:200代表接受成功,5xx代表代表接受失败
        response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        return WxPayNotifyResult.builder().code("FAIL").message("失败").build();
    }

}

El siguiente es el código lógico de verificación y descifrado de parámetros escrito de acuerdo con el caso oficial.Transacción
: Son los parámetros de resultado de pago descifrados, incluido el estado del pago, el número de pedido, el monto del pago, etc.

public Transaction notify2Transaction(String body, Map<String, String> headers) {
    
    
    	
    //从请求头拿到相关参数
    String nonce = headers.get("wechatpay-nonce");
    String signature = headers.get("wechatpay-signature");
    String timestamp = headers.get("wechatpay-timestamp");
    String signaturetype = headers.get("wechatpay-signature-type");
    String  serial = headers.get("wechatpay-serial");

    //构建请求参数对象
    RequestParam requestParam = new RequestParam.Builder()
            .serialNumber(serial)
            .nonce(nonce)
            .signature(signature)
            .timestamp(timestamp)
            .signType(signaturetype)
            .body(body)
            .build();

    // 初始化 NotificationParser , 这里的config是RSAAutoCertificateConfig
    NotificationParser parser = new NotificationParser(config);

    // 以支付通知回调为例,验签、解密并转换成 Transaction
        return parser.parse(requestParam, Transaction.class);

    }

El resto es procesar los resultados comerciales correspondientes de acuerdo con la Transacción.

El artículo ha terminado, espero que te pueda ayudar.

Supongo que te gusta

Origin blog.csdn.net/u014494148/article/details/131875922
Recomendado
Clasificación