国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java】微信小程序V3支付(后臺(tái))

這篇具有很好參考價(jià)值的文章主要介紹了【Java】微信小程序V3支付(后臺(tái))。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

目錄

????????相關(guān)官網(wǎng)文檔

????????1.需要的參數(shù)

????????2.引入庫(kù)

????????3.用到的工具類

????????4.支付下單實(shí)現(xiàn)

????????5.支付回調(diào)


相關(guān)官網(wǎng)文檔

接入前準(zhǔn)備-小程序支付 | 微信支付商戶平臺(tái)文檔中心

微信支付-JSAPI下單

獲取平臺(tái)證書列表-文檔中心-微信支付商戶平臺(tái)

微信支付-支付通知API

1.需要的參數(shù)

# appId

wechat.appid=${WECHAT_APPID}

# 商戶號(hào)

wechat.mchid=${WECHAT_MCHID}

# 證書序列號(hào)

wechat.mch.certno=${WECHAT_CERTNO}

# APIv3密鑰

wechat.pay.api-v3-key=${WECHAT_V3KEY}

證書下載,apiclient_cert.p12,放到resource目錄下

【Java】微信小程序V3支付(后臺(tái)),微信小程序,java,小程序

需要的參數(shù)和證書,根據(jù)接入前準(zhǔn)備官方文檔獲取。

2.引入庫(kù)

<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-apache-httpclient</artifactId>
    <version>0.2.2</version>
</dependency>

3.用到的工具類

import com.wechat.pay.contrib.apache.httpclient.auth.AutoUpdateCertificatesVerifier;
import com.wechat.pay.contrib.apache.httpclient.auth.PrivateKeySigner;
import com.wechat.pay.contrib.apache.httpclient.auth.WechatPay2Credentials;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;
import org.springframework.util.Base64Utils;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.security.cert.X509Certificate;
import java.util.Date;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * @author Grace
 */
@Component
public class KeyPairFactory {
    @Value("${wechat.mchid}")
    private String MCHID;

    @Value("${wechat.mch.certno}")
    private String CERTNO;

    @Value("${wechat.pay.api-v3-key}")
    private String V3KEY;
    
    private KeyStore store;
    private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    private static final Random RANDOM = new SecureRandom();
    private final Object lock = new Object();
    
    private static final Map<String, Object> VERIFIER_MAP = new ConcurrentHashMap<>();
    
    /**
     * 獲取公私鑰.
     *
     * @param keyPath  API證書apiclient_cert.p12的classpath路徑
     * @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();
            // 證書的序列號(hào)
//            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);
        }
    }

    /**
     * V3  SHA256withRSA 簽名.
     *
     * @param method       請(qǐng)求方法  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    當(dāng)前時(shí)間戳   因?yàn)橐渲玫絋OKEN 中所以 簽名中的要跟TOKEN 保持一致
     * @param nonceStr     隨機(jī)字符串  要和TOKEN中的保持一致
     * @param body         請(qǐng)求體 GET 為 "" POST 為JSON
     * @param keyPair      商戶API 證書解析的密鑰對(duì)  實(shí)際使用的是其中的私鑰
     * @return the string
     */
    @SneakyThrows
    public String requestSign(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());
    }

    @SneakyThrows
    public String awakenPaySign(String appid, long timestamp, String nonceStr, String body, KeyPair keyPair)  {
        String signatureStr = Stream.of(appid,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());
    }

    /**
     * 生成Token.
     *
     * @param mchId 商戶號(hào)
     * @param nonceStr   隨機(jī)字符串 
     * @param timestamp  時(shí)間戳
     * @param serialNo   證書序列號(hào)
     * @param signature  簽名
     * @return the string
     */
    public String token(String mchId, String nonceStr, long timestamp, String serialNo, String signature) {
        final String TOKEN_PATTERN = "WECHATPAY2-SHA256-RSA2048 mchid=\"%s\",nonce_str=\"%s\","
                + "timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\"";
        // 生成token
        return String.format(TOKEN_PATTERN,
                mchId,
                nonceStr, timestamp, serialNo, signature);
    }

    public String generateNonceStr() {
        char[] nonceChars = new char[32];
        for (int index = 0; index < nonceChars.length; ++index) {
            nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
        }
        return new String(nonceChars);
    }

    /**
     * 解密響應(yīng)體.
     *
     * @param apiV3Key       API V3 KEY  API v3密鑰 商戶平臺(tái)設(shè)置的32位字符串
     * @param associatedData  response.body.data[i].encrypt_certificate.associated_data
     * @param nonce          response.body.data[i].encrypt_certificate.nonce
     * @param ciphertext     response.body.data[i].encrypt_certificate.ciphertext
     * @return the string
     * @throws GeneralSecurityException the general security exception
     */
    public String decryptResponseBody(String apiV3Key, String associatedData, String nonce, String ciphertext) {
        try {
            Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
            SecretKeySpec key = new SecretKeySpec(apiV3Key.getBytes(StandardCharsets.UTF_8), "AES");
            GCMParameterSpec spec = new GCMParameterSpec(128, nonce.getBytes(StandardCharsets.UTF_8));

            cipher.init(Cipher.DECRYPT_MODE, key, spec);
            cipher.updateAAD(associatedData.getBytes(StandardCharsets.UTF_8));
            byte[] bytes;
            try {
                bytes = cipher.doFinal(Base64Utils.decodeFromString(ciphertext));
            } catch (GeneralSecurityException e) {
                throw new IllegalArgumentException(e);
            }
            return new String(bytes, StandardCharsets.UTF_8);
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            throw new IllegalStateException(e);
        } catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
            throw new IllegalArgumentException(e);
        }
    }

    /**
     * 構(gòu)造驗(yàn)簽名串.
     *
     * @param wechatpayTimestamp HTTP頭 Wechatpay-Timestamp 中的應(yīng)答時(shí)間戳。
     * @param wechatpayNonce     HTTP頭 Wechatpay-Nonce 中的應(yīng)答隨機(jī)串
     * @param body               響應(yīng)體
     * @return the string
     */
    public String responseSign(String wechatpayTimestamp, String wechatpayNonce, String body) {
        return Stream.of(wechatpayTimestamp, wechatpayNonce, body)
                .collect(Collectors.joining("\n", "", "\n"));
    }

    public AutoUpdateCertificatesVerifier getVerifier() {
        AutoUpdateCertificatesVerifier verifier = (AutoUpdateCertificatesVerifier) VERIFIER_MAP.get("verifier");
        Date notAfter = (Date) VERIFIER_MAP.get("notAfter");
        if(null == verifier || null == notAfter || notAfter.before(new Date())){
            // 加載證書
            KeyPair keyPair = createPKCS12("/apiclient_cert.p12",
                    "Tenpay Certificate", MCHID);
            // 加載官方自動(dòng)更新證書
            verifier = new AutoUpdateCertificatesVerifier(new WechatPay2Credentials(MCHID,
                    new PrivateKeySigner(CERTNO, keyPair.getPrivate())),
                    V3KEY.getBytes(StandardCharsets.UTF_8));
            VERIFIER_MAP.put("verifier", verifier);
            VERIFIER_MAP.put("notAfter", verifier.getValidCertificate().getNotAfter());
        }
        return verifier;
    }
    
}

官方證書驗(yàn)證工具放到了全局變量中,

4.支付下單實(shí)現(xiàn)

    @ApiOperation(value = "支付", httpMethod = "POST")
    @RequestMapping(value = "/api/pay/order", method = RequestMethod.POST)
    @Transactional
    public PrePayResponse wxToPay(@Valid @RequestBody PayOrderRequest dto, HttpServletRequest request, HttpServletResponse response) throws Exception {
        PrePayResponse res = new PrePayResponse();
        // 用戶登錄校驗(yàn)
        ......
        // 獲取用戶(數(shù)據(jù)庫(kù)中的實(shí)體類)
        WechatUser user = xxx.getUser();

        int fee = 0;
        // 得到小程序傳過來的價(jià)格,注意這里的價(jià)格必須為整數(shù),1代表1分,所以傳過來的值必須*100;
        if (null != dto.getPrice()) {
            double price = dto.getPrice() * 100;
            fee = (int) price;

        }
        // 生成訂單號(hào),商戶系統(tǒng)內(nèi)部訂單號(hào),只能是數(shù)字、大小寫字母_-*且在同一個(gè)商戶號(hào)下唯一
        String OutTradeNo = DateUtil.getOrderNum() + String.valueOf(System.currentTimeMillis()).substring(4) + new Random().nextInt(999999999);

        // 保存訂單信息
        PayOrder order = new PayOrder();
        order.setUser(user);
        order.setCreatedAt(new Date());
        order.setPrice(dto.getPrice());
        order.setTradeNo(OutTradeNo);
        ......
        payOrderRepository.save(order);

        // 異步接收微信支付結(jié)果通知的回調(diào)地址,通知url必須為外網(wǎng)可訪問的url,不能攜帶參數(shù)。 公網(wǎng)域名必須為https,如果是走專線接入,使用專線NAT IP或者私有回調(diào)域名可使用http
        String basePath  = request.getScheme() + "://" + request.getServerName() + ":" +
                request.getServerPort()  + request.getContextPath();
        String notify_url = basePath+"/api/anon/pay/notify";

        //請(qǐng)求參數(shù)
        cn.hutool.json.JSONObject json = new cn.hutool.json.JSONObject();
        json.set("appid", APPID);
        json.set("mchid", MCHID); // 商戶號(hào)
        json.set("description", "test"); // 商品描述,必填
        json.set("out_trade_no", OutTradeNo);
        json.set("attach", "自定義參數(shù)"); // 附加數(shù)據(jù),在查詢API和支付通知中原樣返回,可作為自定義參數(shù)使用
        json.set("notify_url", notify_url); // 回調(diào)地址
        cn.hutool.json.JSONObject amount = new cn.hutool.json.JSONObject();
        amount.set("total", fee);
        amount.set("currency", "CNY");
        json.set("amount",amount); // 訂單金額
        cn.hutool.json.JSONObject payer = new cn.hutool.json.JSONObject();
        payer.set("openid", user.getOpenId()); // 用戶openId
        json.set("payer",payer); // 支付者

        //獲取token
        String nonceStr = keyPairFactory.generateNonceStr();
        long timestamp = System.currentTimeMillis()/1000;
        res.setNonceStr(nonceStr);
        res.setTimeStamp(timestamp);
        String wechatToken = this.getToken(JSON.toJSONString(json), "POST",  "/v3/pay/transactions/jsapi", nonceStr, timestamp);

        Map<String,String> headers = new HashMap<String,String>();
        headers.put("Accept","application/json");
        headers.put("Content-Type","application/json; charset=utf-8");
        headers.put("Authorization",wechatToken);

        HttpResponse httpResponse = HttpRequest.post("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi")
                .headerMap(headers, false)
                .body(String.valueOf(json))
                .timeout(5 * 60 * 1000)
                .execute();
        String resultBody = httpResponse.body();

        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(resultBody);
        String prepayId = jsonObject.getString("prepay_id");
        if(StringUtils.isEmpty(prepayId)){
            order.setStatus(-1);
            res.setCode(Constants.SC_MSG);
            res.setMessage("支付失敗");
            return res;
        }
        res.setPrepayId(prepayId);
        res.setSignType("RSA");
        // 加載證書
        KeyPair keyPair = keyPairFactory.createPKCS12("/apiclient_cert.p12",
                "Tenpay Certificate", MCHID);
        String paySign = keyPairFactory.awakenPaySign(APPID, timestamp, nonceStr, "prepay_id="+prepayId, keyPair);
        res.setPaySign(paySign);
        res.setCode(Constants.SC_OK);
        return res;
    }


    private String getToken(String body,String method,String url, String nonceStr, Long timestamp) {
	    //1.加載證書
	    KeyPair keyPair = keyPairFactory.createPKCS12("/apiclient_cert.p12", "Tenpay Certificate", MCHID);
	    //2.獲取簽名
	    String sign = keyPairFactory.requestSign(method, url, timestamp, nonceStr, body,keyPair);
	    //3.封裝token
	    String token = keyPairFactory.token(MCHID, nonceStr, timestamp, CERTNO, sign);
	    return token;
    }

5.支付回調(diào)

    @ApiOperation(value = "支付回調(diào)地址")
    @RequestMapping(value = "/api/anon/pay/notify", produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    @Transactional
    public ResultResponse notify(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ResultResponse res = new ResultResponse();

        // 從請(qǐng)求頭獲取驗(yàn)簽字段
        String Timestamp = request.getHeader("Wechatpay-Timestamp");
        String Nonce = request.getHeader("Wechatpay-Nonce");
        String Signature = request.getHeader("Wechatpay-Signature");
        String Serial = request.getHeader("Wechatpay-Serial");

        // 獲取官方驗(yàn)簽工具
        AutoUpdateCertificatesVerifier verifier = keyPairFactory.getVerifier();

        // 讀取請(qǐng)求體的信息
        ServletInputStream inputStream = request.getInputStream();
        StringBuffer stringBuffer = new StringBuffer();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s;
        // 讀取回調(diào)請(qǐng)求體
        while ((s = bufferedReader.readLine()) != null) {
            stringBuffer.append(s);
        }
        String s1 = stringBuffer.toString();
        Map requestMap = (Map) JSON.parse(s1);
        String resource = String.valueOf(requestMap.get("resource"));
        Map requestMap2 = (Map) JSON.parse(resource);
        String associated_data = requestMap2.get("associated_data").toString();
        String nonce = requestMap2.get("nonce").toString();
        String ciphertext = requestMap2.get("ciphertext").toString();

        //按照文檔要求拼接驗(yàn)簽串
        String VerifySignature = Timestamp + "\n" + Nonce + "\n" + s1 + "\n";
//        System.out.println("拼接后的驗(yàn)簽串=" + VerifySignature);

        //使用官方驗(yàn)簽工具進(jìn)行驗(yàn)簽
        boolean verify = verifier.verify(Serial, VerifySignature.getBytes(), Signature);

        //判斷驗(yàn)簽的結(jié)果
//        System.out.println("驗(yàn)簽結(jié)果:"+verify);

        // 驗(yàn)簽成功
//        System.out.println("驗(yàn)簽成功后,開始進(jìn)行解密");
        com.wechat.pay.contrib.apache.httpclient.util.AesUtil aesUtil = new AesUtil(V3KEY.getBytes());
        String aes = aesUtil.decryptToString(associated_data.getBytes(), nonce.getBytes(), ciphertext);

        com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(aes);
        if ("SUCCESS".equals(jsonObject.getString("trade_state"))) {
            String out_trade_no = jsonObject.getString("out_trade_no");
            // 訂單不為空
            if (!StringUtils.isEmpty(out_trade_no)) {
                //支付成功后的業(yè)務(wù)處理
                PayOrder payOrder = payOrderRepository.findByTradeNo(out_trade_no);
                payOrder.setStatus(1);
                ......
                res.setCode(Constants.SC_OK);
                return res;
            }
        } else {
            // 支付失敗后的操作
        }
        res.setCode(Constants.SC_OK);
        return res;
    }

注意:回調(diào)接口不要被攔截文章來源地址http://www.zghlxwxcb.cn/news/detail-521399.html

到了這里,關(guān)于【Java】微信小程序V3支付(后臺(tái))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot整合微信小程序支付V3(支付、退款)

    微信支付開發(fā)前,需要先獲取商家信息,包括商戶號(hào)、AppId、證書和密鑰。 獲取商戶號(hào) 微信商戶平臺(tái) 申請(qǐng)成為商戶 = 提交資料 = 簽署協(xié)議 = 獲取商戶號(hào) 獲取AppID 微信公眾平臺(tái) 注冊(cè)服務(wù)號(hào) = 服務(wù)號(hào)認(rèn)證 = 獲取APPID = 綁定商戶號(hào) 申請(qǐng)商戶證書 登錄商戶平臺(tái) = 選擇 賬戶中心 = 安

    2024年02月08日
    瀏覽(50)
  • 微信小程序支付V3版本接口實(shí)現(xiàn)

    微信小程序支付V3版本接口實(shí)現(xiàn)

    特別說明:遇到 java.security.InvalidKeyException: Illegal key size ******* getValidator的錯(cuò)誤 參考添加鏈接描述 JDK7的下載地址 JDK8的下載地址: 下載后解壓,可以看到local_policy.jar和US_export_policy.jar以及readme.txt 如果安裝了JRE,將兩個(gè)jar文件放到%JRE_HOME%libsecurity目錄下覆蓋原來的文件 如果安

    2024年02月09日
    瀏覽(25)
  • SpringBoot 整合微信小程序微信支付V3 jsapi (支付、退款)

    SpringBoot 整合微信小程序微信支付V3 jsapi (支付、退款)

    最近的一個(gè)微信小程序項(xiàng)目里有用到微信支付,網(wǎng)上找的資料都是特別亂,看起來特別懵,結(jié)合了好多文章的內(nèi)容,終于做了出來,可能我的這個(gè)博文看起來也是特別亂,但是是可以直接C走簡(jiǎn)單改一改就可以用的。(支付成功回調(diào),和退款回調(diào)因?yàn)樽蛱靹傇诎⒗锷暾?qǐng)的域名還

    2024年04月25日
    瀏覽(23)
  • springboot實(shí)現(xiàn)微信小程序V3微信支付功能

    appId:小程序appid appSecret:小程序的secret mchId:商戶號(hào) keyPath:商戶私鑰路徑(apiclient_key.pem) certPath:證書路徑(apiclient_cert.pem) platFormPath:平臺(tái)證書(cert.pem) 注 : 需要通過寫程序生成平臺(tái)證書(見v3Get()方法) apiKey3:apiv3密鑰 serialnumber:商戶證書序列號(hào) notifyUrl:回調(diào)地

    2024年02月12日
    瀏覽(96)
  • springboot整合IJPay實(shí)現(xiàn)微信支付-V3---微信小程序

    springboot整合IJPay實(shí)現(xiàn)微信支付-V3---微信小程序

    微信支付適用于許多場(chǎng)合,如小程序、網(wǎng)頁支付、但微信支付相對(duì)于其他支付方式略顯麻煩,我們使用IJpay框架進(jìn)行整合 JPay 讓支付觸手可及, 封裝了微信支付、支付寶支付、銀聯(lián)支付常用的支付方式以及各種常用的接口。不依賴任何第三方 mvc 框架,僅僅作為工具使用簡(jiǎn)單

    2024年02月02日
    瀏覽(57)
  • java微信支付v3系列——5.微信支付成功回調(diào)

    java微信支付v3系列——1.微信支付準(zhǔn)備工作 java微信支付v3系列——2.微信支付基本配置 java微信支付v3系列——3.訂單創(chuàng)建準(zhǔn)備操作 java微信支付v3系列——4.創(chuàng)建訂單的封裝及使用 java微信支付v3系列——5.微信支付成功回調(diào) java微信支付v3系列——6.微信支付查詢訂單API java微信支

    2024年01月17日
    瀏覽(26)
  • Java實(shí)現(xiàn)微信支付v3的支付回調(diào)

    Java實(shí)現(xiàn)微信支付v3的支付回調(diào)

    以前都是自己手搓api的, 現(xiàn)在有輪子了, 嘗試記錄一下如何使用 我的做法是首先打開v3的代碼倉(cāng)庫(kù), 直接進(jìn)去看看他們的文檔, 可以看到這么一坨東西 開發(fā)前準(zhǔn)備 2. 先引入maven 初始化商戶配置 先從請(qǐng)求頭中獲取構(gòu)建RequestParam需要的參數(shù) 初始化解析器 進(jìn)行驗(yàn)簽, 解密并轉(zhuǎn)換成

    2024年02月12日
    瀏覽(25)
  • 微信小程序支付-java對(duì)接微信

    ?一共是兩個(gè)方法: 一個(gè)方法后臺(tái)生成預(yù)支付訂單,得到預(yù)支付交易會(huì)話標(biāo)識(shí)prepay_id,傳給前端,讓前端調(diào)起小程序支付; 一個(gè)是支付回調(diào) 目錄 一、生成預(yù)支付訂單? 注意: 二、 支付回調(diào) ? ? ? ? 封裝參數(shù)向微信發(fā)送生成預(yù)支付交易單請(qǐng)求,微信會(huì)返回一個(gè)prepay_id,再將

    2024年02月12日
    瀏覽(20)
  • java微信支付v3系列——6.微信支付查詢訂單API

    java微信支付v3系列——1.微信支付準(zhǔn)備工作 java微信支付v3系列——2.微信支付基本配置 java微信支付v3系列——3.訂單創(chuàng)建準(zhǔn)備操作 java微信支付v3系列——4.創(chuàng)建訂單的封裝及使用 java微信支付v3系列——5.微信支付成功回調(diào) java微信支付v3系列——6.微信支付查詢訂單API java微信支

    2023年04月08日
    瀏覽(30)
  • 【微信小程序】Java實(shí)現(xiàn)微信支付(小程序支付JSAPI-V3)java-sdk工具包

    【微信小程序】Java實(shí)現(xiàn)微信支付(小程序支付JSAPI-V3)java-sdk工具包

    ? ? ? 對(duì)于一個(gè)沒有寫過支付的小白,打開微信支付官方文檔時(shí)徹底懵逼 ,因?yàn)?微信支付文檔太過詳細(xì), 導(dǎo)致我無從下手,所以寫此文章,幫助第一次寫支付的小伙伴梳理一下。 一、流程分為三個(gè)接口:(這是前言,先看一遍,保持印象,方便理解代碼) 1、第一個(gè)接口:

    2024年02月03日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包