Table des matières
1. Préface
2. Certificat API
Analyse du certificat API
3. Signature V3
Format de signature
Générer une signature
Maison Java JavaBase Explication détaillée du paiement WeChat en Java (1) : signature de version API V3

Explication détaillée du paiement WeChat en Java (1) : signature de version API V3

Oct 27, 2020 pm 05:20 PM
java 微信支付

Tutoriel de base JavaLa colonne présente le paiement WeChat en Java et implémente la signature de la version API V3.

Explication détaillée du paiement WeChat en Java (1) : signature de version API V3

1. Préface

J'ai récemment eu du mal avec le paiement WeChat et les certificats sont assez ennuyeux, il est donc nécessaire de partager quelques expériences. pour réduire votre temps de développement. Pièges lors du paiement avec WeChat. À l'heure actuelle, l'API de paiement WeChat a été développée vers la version V3, adoptant le style populaire Restful.

Explication détaillée du paiement WeChat en Java (1) : signature de version API V3

Aujourd'hui, je vais partager les difficultés du paiement WeChat - Signature Bien qu'il existe de nombreux SDK utiles, si vous souhaitez comprendre le paiement WeChat en profondeur, vous devez encore le comprendre pendant un instant.

2. Certificat API

Afin d'assurer la sécurité des données financières sensibles et de garantir que les transactions financières de notre entreprise sont infaillibles. Actuellement, WeChat Pay utilise la clé privée fournie dans le certificat CA faisant autorité (certificat API) émis par un tiers pour signer. Vous pouvez configurer et obtenir des certificats API via la plateforme marchand.

Explication détaillée du paiement WeChat en Java (1) : signature de version API V3

N'oubliez pas que vous serez invité à télécharger lorsque vous le configurerez pour la première fois. Le téléchargement ne sera plus fourni plus tard. Veuillez vous référer aux instructions pour plus de détails.

Explication détaillée du paiement WeChat en Java (1) : signature de version API V3说明

Après le réglage, recherchez le package compressé zip et décompressez-le. Il contient de nombreux fichiers. Pour le développement JAVA, il vous suffit de faire attention au fichier de certificat, qui contient apiclient_cert.p12, nous devons le mettre côté serveur et utiliser Java pour analyser le fichier 公私钥 afin d'obtenir les clés publiques et privées. .p12

Assurez-vous d'assurer la sécurité du certificat côté serveur, ce qui implique une sécurité financière.

Analyse du certificat API

L'étape suivante consiste à analyser le certificat. Il existe de nombreuses façons d'analyser le certificat sur Internet. Ici, j'utilise une méthode plus "formelle" pour analyser, en utilisant. le package de sécurité JDKjava.security.KeyStore à analyser.

Le certificat de l'API de paiement WeChat utilise l'algorithme PKCS12 Nous utilisons KeyStore pour obtenir le support de la paire de clés publique et privée KeyPair et le numéro de série du certificat serialNumber. class :

import org.springframework.core.io.ClassPathResource;import java.security.KeyPair;import java.security.KeyStore;import java.security.PrivateKey;import java.security.PublicKey;import java.security.cert.X509Certificate;/**
 * KeyPairFactory
 *
 * @author dax
 * @since 13:41
 **/public class KeyPairFactory {    private KeyStore store;    private final Object lock = new Object();    /**
     * 获取公私钥.
     *
     * @param keyPath  the key path
     * @param keyAlias the key alias
     * @param keyPass  password
     * @return the key pair
     */
    public KeyPair createPKCS12(String keyPath, String keyAlias, String keyPass) {
        ClassPathResource resource = new ClassPathResource(keyPath);        char[] pem = keyPass.toCharArray();        try {            synchronized (lock) {                if (store == null) {                    synchronized (lock) {
                        store = KeyStore.getInstance("PKCS12");
                        store.load(resource.getInputStream(), pem);
                    }
                }
            }
            X509Certificate certificate = (X509Certificate) store.getCertificate(keyAlias);
            certificate.checkValidity();            // 证书的序列号 也有用
            String serialNumber = certificate.getSerialNumber().toString(16).toUpperCase();            // 证书的 公钥
            PublicKey publicKey = certificate.getPublicKey();            // 证书的私钥
            PrivateKey storeKey = (PrivateKey) store.getKey(keyAlias, pem);    
            return new KeyPair(publicKey, storeKey);

        } catch (Exception e) {            throw new IllegalStateException("Cannot load keys from store: " + resource, e);
        }
    }
}复制代码
Copier après la connexion

Si cela semble familier, on peut voir qu'il s'agit d'une version modifiée de la méthode d'extraction de clés publiques et privées utilisée par JWT dans le didacticiel Spring Security. Vous pouvez comparer les différences.

Il y a trois paramètres dans cette méthode, qui doivent être expliqués ici :

  • keyPath Le chemin apiclient_cert.p12 du certificat API classpath, généralement nous le ferons mettez-le dans le chemin resources, vous pouvez bien sûr modifier la manière d'obtenir le flux d'entrée du certificat.
  • keyAlias L'alias du certificat n'est pas disponible dans ce document WeChat. Brother Fat l'a obtenu par DEBUG lors du chargement du certificat et a constaté que la valeur est fixée à Tenpay Certificate.
  • keyPass Mot de passe du certificat, c'est le numéro du commerçant par défaut, il est également nécessaire dans d'autres configurations mchid, c'est-à-dire que vous utilisez le super administrateur pour vous connecter au WeChat plateforme marchande dans votre profil personnel une chaîne de chiffres.

3. Signature V3

La signature de la version WeChat Pay V3 est que nous portons une signature spécifique dans l'en-tête de la requête HTTP lors de l'appel du WeChat Pay spécifique API La chaîne de codage est utilisée par le serveur de paiement WeChat pour vérifier la source de la demande afin de garantir que la demande est authentique et digne de confiance.

Format de signature

Le format spécifique de la chaîne de signature, pas moins de cinq lignes au total, chaque ligne se termine par un caractère de nouvelle ligne n.

HTTP请求方法\n
URL\n
请求时间戳\n
请求随机串\n
请求报文主体\n复制代码
Copier après la connexion
  • Méthode de demande HTTP La méthode de demande requise par l'API de paiement WeChat que vous appelez, par exemple, le paiement APP est POST.
  • URL Par exemple, le document de paiement APP est https://api.mch.weixin.qq.com/v3/pay/transactions/app, supprimez la partie nom de domaine pour obtenir l'URL de la signature participante. S'il y a des paramètres de requête dans la requête, « ? » et la chaîne de requête correspondante doivent être ajoutées à la fin de l'URL. C'est /v3/pay/transactions/app.
  • Demande d'horodatage Horodatage du système du serveur, assurez-vous que l'heure du serveur est correcte et utilisez System.currentTimeMillis() / 1000 pour l'obtenir.
  • Demander une chaîne aléatoire Trouvez simplement une classe d'outils pour générer une chaîne similaire à 593BEC0C930BF1AFEB40B4A08C8FB242.
  • Corps du message de la demande S'il s'agit de GET la requête est directement caractère nul"" lorsque la méthode de requête est POST ou PUT, veuillez utiliser pour envoyer réellement le message de JSON. Pour l'API de téléchargement d'images, veuillez utiliser le message meta correspondant à JSON.

Générer une signature

Ensuite, nous utilisons la clé privée du commerçant pour exécuter SHA256 avec la signature RSA sur la chaîne à signer dans le format ci-dessus, et exécutons Encodage Base64Obtenir la valeur de la signature. Le code Java de base correspondant est :

/**
 * V3  SHA256withRSA 签名.
 *
 * @param method       请求方法  GET  POST PUT DELETE 等
 * @param canonicalUrl 例如  https://api.mch.weixin.qq.com/v3/pay/transactions/app?version=1 ——> /v3/pay/transactions/app?version=1
 * @param timestamp    当前时间戳   因为要配置到TOKEN 中所以 签名中的要跟TOKEN 保持一致
 * @param nonceStr     随机字符串  要和TOKEN中的保持一致
 * @param body         请求体 GET 为 "" POST 为JSON
 * @param keyPair      商户API 证书解析的密钥对  实际使用的是其中的私钥
 * @return the string
 */@SneakyThrowsString sign(String method, String canonicalUrl, long timestamp, String nonceStr, String body, KeyPair keyPair)  {
    String signatureStr = Stream.of(method, canonicalUrl, String.valueOf(timestamp), nonceStr, body)
            .collect(Collectors.joining("\n", "", "\n"));
    Signature sign = Signature.getInstance("SHA256withRSA");
    sign.initSign(keyPair.getPrivate());
    sign.update(signatureStr.getBytes(StandardCharsets.UTF_8));    return Base64Utils.encodeToString(sign.sign());
}复制代码
Copier après la connexion
4. Utilisez la signature

pour générer une signature avec certains paramètres pour former un

et placez-la dans l'en-tête de requête Token de la requête HTTP correspondante. Le format est : Authorization

Authorization: WECHATPAY2-SHA256-RSA2048 {Token}复制代码
Copier après la connexion

se compose des cinq parties suivantes : Token

  • Le numéro de commerçant du commerçant (y compris commerçant direct, service fournisseur ou commerçant canal) qui a initié la demande

    mchid

  • Numéro de série du certificat API marchand

    , utilisé pour déclarer le certificat utiliséserial_no

  • Demande de chaîne aléatoire

    nonce_str

  • Horodatage

    timestamp

  • Valeur de signature

    signature

Code principal généré :Token

/**
 * 生成Token.
 *
 * @param mchId 商户号
 * @param nonceStr   随机字符串 
 * @param timestamp  时间戳
 * @param serialNo   证书序列号
 * @param signature  签名
 * @return the string
 */String token(String mchId, String nonceStr, long timestamp, String serialNo, String signature) {    final String TOKEN_PATTERN = "mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\"";    // 生成token
    return String.format(TOKEN_PATTERN,
            wechatPayProperties.getMchId(),
            nonceStr, timestamp, serialNo, signature);
}复制代码
Copier après la connexion
Mettez le

généré dans l'en-tête de la requête selon le format ci-dessus pour terminer l'utilisation de la signature. Token

5. Résumé

Dans cet article, nous avons effectué une analyse complète des signatures difficiles et de l'utilisation des signatures dans la version WeChat Pay V3, et avons également expliqué l'analyse des certificats API I. je pense que cela peut vous aider à résoudre certains problèmes spécifiques liés au développement des paiements.

Recommandations d'apprentissage gratuites associées :

Tutoriel Java Basic

Introduction à l'article connexe :

Comment implémenter la fonction de paiement du mini-programme

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Programme Java pour trouver le volume de la capsule Programme Java pour trouver le volume de la capsule Feb 07, 2025 am 11:37 AM

Les capsules sont des figures géométriques tridimensionnelles, composées d'un cylindre et d'un hémisphère aux deux extrémités. Le volume de la capsule peut être calculé en ajoutant le volume du cylindre et le volume de l'hémisphère aux deux extrémités. Ce tutoriel discutera de la façon de calculer le volume d'une capsule donnée en Java en utilisant différentes méthodes. Formule de volume de capsule La formule du volume de la capsule est la suivante: Volume de capsule = volume cylindrique volume de deux hémisphères volume dans, R: Le rayon de l'hémisphère. H: La hauteur du cylindre (à l'exclusion de l'hémisphère). Exemple 1 entrer Rayon = 5 unités Hauteur = 10 unités Sortir Volume = 1570,8 unités cubes expliquer Calculer le volume à l'aide de la formule: Volume = π × r2 × h (4

Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Comment exécuter votre première application Spring Boot dans Spring Tool Suite? Feb 07, 2025 pm 12:11 PM

Spring Boot simplifie la création d'applications Java robustes, évolutives et prêtes à la production, révolutionnant le développement de Java. Son approche "Convention sur la configuration", inhérente à l'écosystème de ressort, minimise la configuration manuelle, allo

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

Java Made Simple : un guide du débutant sur la puissance de programmation Java Made Simple : un guide du débutant sur la puissance de programmation Oct 11, 2024 pm 06:30 PM

Java Made Simple : Guide du débutant sur la puissance de programmation Introduction Java est un langage de programmation puissant utilisé dans tout, des applications mobiles aux systèmes d'entreprise. Pour les débutants, la syntaxe de Java est simple et facile à comprendre, ce qui en fait un choix idéal pour apprendre la programmation. Syntaxe de base Java utilise un paradigme de programmation orienté objet basé sur les classes. Les classes sont des modèles qui organisent ensemble les données et les comportements associés. Voici un exemple simple de classe Java : publicclassPerson{privateStringname;privateintage;

Programme Java pour insérer un élément au bas d'une pile Programme Java pour insérer un élément au bas d'une pile Feb 07, 2025 am 11:59 AM

Une pile est une structure de données qui suit le principe LIFO (dernier dans, premier sorti). En d'autres termes, le dernier élément que nous ajoutons à une pile est le premier à être supprimé. Lorsque nous ajoutons (ou poussons) des éléments à une pile, ils sont placés sur le dessus; c'est-à-dire surtout

Quelle est la différence entre la production de pages H5 et les applets WeChat Quelle est la différence entre la production de pages H5 et les applets WeChat Apr 05, 2025 pm 11:51 PM

H5 est plus flexible et personnalisable, mais nécessite une technologie qualifiée; Les mini-programmes sont rapides à démarrer et faciles à entretenir, mais sont limités par le cadre WeChat.

See all articles