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

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

這篇具有很好參考價值的文章主要介紹了【微信小程序】Java實現(xiàn)微信支付(小程序支付JSAPI-V3)java-sdk工具包。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

? ? ? 對于一個沒有寫過支付的小白,打開微信支付官方文檔時徹底懵逼,因為微信支付文檔太過詳細(xì),導(dǎo)致我無從下手,所以寫此文章,幫助第一次寫支付的小伙伴梳理一下。

一、流程分為三個接口:(這是前言,先看一遍,保持印象,方便理解代碼)

1、第一個接口:微信預(yù)支付?小程序調(diào)用后端預(yù)支付接口? =>預(yù)支付接口調(diào)用成功返回給小程序支付憑證id
(如下返回示例示例,能返回這些代表后端工作完成了一半了,在第一個接口中,我加入了保存訂單信息業(yè)務(wù),將訂單狀態(tài)保存為待支付狀態(tài))

{
    "timeStamp": "1414561699",
    "nonceStr": "5K8264ILTKCH16CQ2502SI8ZNMTM67VS",
    "package": "prepay_id=wx201410272009395522657a690389285100",
    "paySign": "oR9d8PuhnIc+YZ8cBHFCwfgpaK9gd7vaRvkYD7rthRAZ\/X+QBhcCYL21N7cHCTUxbQ+EAt6Uy+lwSN22f5YZvI45MLko8Pfso0jm46v5hqcVwrk6uddqNjKNqZLhLw4jq\/xDg=="
  }

? ? ? ? 這些就是第一個接口需要返回的數(shù)據(jù),也是微信支付官方文檔要求返回的數(shù)據(jù),有了這些支付憑證,前端就可以拿去直接調(diào)用微信后臺支付接口。

2、第二個接口:支付回調(diào)?小程序支付成功后,微信后臺執(zhí)行支付回調(diào)將支付訂單信息返回。(在此接口中,我將上一個接口的待支付狀態(tài)更新為訂單已支付狀態(tài),并且保存充值流水日志,更新充值人的余額操作。)?

此接口可能出現(xiàn)的問題:①.在正常流程下,已經(jīng)完成了支付,但是如果某些原因?qū)е轮Ц痘卣{(diào)失敗,比如由于微信的原因?qū)е露啻握{(diào)用了此接口,針對此接口冪等性,我們可以在做業(yè)務(wù)更新流程之前先進行訂單的狀態(tài)判斷,讓已經(jīng)回調(diào)一次的訂單不再進行保存流水以及余額的更新。

②.由于服務(wù)器宕機或者延遲等問題原因回調(diào)接口失敗時,這時用戶有可能已經(jīng)付錢,但是沒有進行業(yè)務(wù)更新流程,導(dǎo)致充值沒有余額增加,充值流水缺失等問題,就要需要第三個接口解決。

3.第三個接口:支付訂單查詢 此訂單查詢顧名思義就是查詢訂單,先去查詢訂單狀態(tài),如果為已支付說明回調(diào)沒問題,如果為待支付,就去微信提供的接口查詢是否支付,支付成功就重復(fù)第二步中更新訂單狀態(tài)保存訂單流水更新用戶余額操作,因為第二步回調(diào)失敗所以需要再次此操作。

后續(xù)更新加鎖操作,進行并發(fā)控制。。。。。。。

二、開始擼代碼

1、maven
<dependency>
  <groupId>com.github.wechatpay-apiv3</groupId>
  <artifactId>wechatpay-java</artifactId>
  <version>0.2.11</version>
</dependency>
2、資源文件配置:配置微信支付前必要的密鑰和商戶信息

微信支付 apiv3 java,微信小程序,微信,小程序,java,spring cloud,spring boot

# 微信小程序支付配置信息
wx:
  # 微信小程序appid
  app-id: *********
  # 商戶號
  mch-id: **********
  # 證書序列號
  mch-serial-no: **********
  # 小程序密鑰
  app-secret: **********
  # api密鑰
  api-key: ***********
  # 回調(diào)接口地址
  notify-url: https://*********/payNotify
  # 證書地址
  key-path: /data/iot/cert/apiclient_key.pem(這是我服務(wù)器中apiclient_key.pem文件存放地址,測試改成本地的)
3、獲取配置信息
@Component
@ConfigurationProperties(prefix = "wx")
@Data
@ToString
public class WxPayV3Bean {
    //小程序appid
    private String appId;
    //商戶號
    private String mchId;
    //證書序列號
    private String mchSerialNo;
    //小程序秘鑰
    private String appSecret;
    //api秘鑰
    private String apiKey;
    //回調(diào)接口地址
    private String notifyUrl;
    //證書地址
    private String keyPath;
}
4、預(yù)支付請求類(由前端傳值 根據(jù)自己業(yè)務(wù)請求添加)
@Data
@Accessors(chain = true)
public class WxPayOrderReqVO {

    @ApiModelProperty(value = "訂單支付類型(商品訂單;預(yù)約訂單)",required = true)
    @NotBlank(message = "訂單支付類型不能為空!")
    private String orderType;//附加數(shù)據(jù),回調(diào)時可根據(jù)這個數(shù)據(jù)辨別訂單類型或其他
 
    @ApiModelProperty(value = "總金額(單位:分)",required = true)
    @NotNull(message = "總金額不能為空!")
    private BigDecimal amount;

    @ApiModelProperty(value = "商品描述",required = true)
    @NotBlank(message = "商品描述不能為空!")
    private String description;
5、工具類
import com.wechat.pay.java.core.util.PemUtil;
import org.springframework.util.Base64Utils;

import java.io.IOException;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Random;
 
/**
 * @project
 * @Classname WXPayUtil
 * @Description TODO
 * @Author: lsh
 * @CreateTime: 2023-10-24  16:00
 */
public class WXPayUtil {
 
    public static String getSign(String signatureStr,String privateKey) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IOException, URISyntaxException {
        //replace 根據(jù)實際情況,不一定都需要
        String replace = privateKey.replace("\\n", "\n");
        PrivateKey merchantPrivateKey = PemUtil.loadPrivateKeyFromPath(replace);
        Signature sign = Signature.getInstance("SHA256withRSA");
        sign.initSign(merchantPrivateKey);
        sign.update(signatureStr.getBytes(StandardCharsets.UTF_8));
        return Base64Utils.encodeToString(sign.sign());
    }
 
}
6、開始寫支付接口

conteoller層 (包含預(yù)支付接口 支付回調(diào)接口,像支付保存訂單業(yè)務(wù)可以寫在與預(yù)付接口里

ApiResponseBody 為我封裝的統(tǒng)一返回接口,改成自己的?。?!

/**
 * @author lsh
 * @ClassName WxPayController
 * @description: TODO
 * @date 2023年10月24日
 */
@Slf4j
@Api(value = "微信-支付", tags = {"微信-支付"})
@RestController
@RequestMapping("wechat/pay")
public class WxPayController{
 
    @Resource
    private WxPayService wxPayService;

    /**
     * 微信預(yù)支付
     * @param req
     * @param request
     * @return
     * @throws Exception
     */
    @ApiOperation(value = "微信預(yù)支付", notes = "微信預(yù)支付")
    @PostMapping("/createOrder")
    public ApiResponseBody createOrder(@RequestBody @Validated WxPayOrderReqVO req, HttpServletRequest request) throws Exception {
        return wxPayService.createOrder(req, request);
    }

    /**
     * 微信支付回調(diào)
     * @param request
     * @return
     * @throws Exception
     */
    @ApiOperation(value = "微信支付回調(diào)", notes = "微信支付回調(diào)")
    @PostMapping("/payNotify")
    public ApiResponseBody payNotify(HttpServletRequest request) throws Exception {
        log.info("-----------------------微信支付回調(diào)通知-----------------------");
       //注意:回調(diào)接口需要暴露到公網(wǎng)上,且要放開token驗證
        return  wxPayService.payNotify(request);
    }

/**
     * 查詢支付
     * @param
     * @return
     * @throws Exception
     */
    @ApiOperation(value = "查詢支付", notes = "查詢支付")
    @GetMapping("/queryPayOrder")
    public ApiResponseBody queryPayOrder(@RequestParam("tradeNo") String tradeNo) {
        log.info("-----------------------訂單號:" + tradeNo);
        if (tradeNo == null || "".equals(tradeNo)) {
            return ApiResponseBody.error(BizCodeMsgEnum.PARAM_ERROR);
        }
        return  wxPayService.queryPayOrder(tradeNo);
    }
}

Service、ServiceImpl層:

    ApiResponseBody createOrder(WxPayOrderReqVO req, HttpServletRequest request) throws Exception;

    ApiResponseBody payNotify(HttpServletRequest request) throws Exception;

    ApiResponseBody queryPayOrder(String tradeNo);

/**
 * @author lsh
 * @ClassName WxPayServiceImpl
 * @description: TODO
 * @date 2023年10月24日
 */
@Service
@Slf4j
public class WxPayServiceImpl implements WxPayService {

    @Resource
    private OrderMapper orderMapper;
    @Resource
    private WxPayV3Bean wxPayV3Bean;
    @Resource
    private WechatUserMapper wechatUserMapper;
    @Resource
    private AccountUserMapper accountUserMapper;


    @Override
    @Transactional(rollbackFor = Exception.class)
    public ApiResponseBody createOrder(WxPayOrderReqVO req, HttpServletRequest request) throws Exception {
        //生成商戶訂單號
        String tradeNo = getTradeNo();
        // 使用自動更新平臺證書的RSA配置,配置微信支付的自動證書管理功能
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(wxPayV3Bean.getMchId())
                        .privateKeyFromPath(wxPayV3Bean.getKeyPath())
                        .merchantSerialNumber(wxPayV3Bean.getMchSerialNo())
                        .apiV3Key(wxPayV3Bean.getApiKey())
                        .build();
        // 構(gòu)建service,用于處理JSAPI支付相關(guān)的操作
        JsapiService service = new JsapiService.Builder().config(config).build();
        // 創(chuàng)建預(yù)支付訂單的請求對象
        PrepayRequest prepayRequest = new PrepayRequest();
        Amount amount = new Amount();
        amount.setTotal(Integer.valueOf(req.getAmount().toString()));
        prepayRequest.setAmount(amount);
        prepayRequest.setAppid(wxPayV3Bean.getAppId());
        prepayRequest.setMchid(wxPayV3Bean.getMchId());
        prepayRequest.setNotifyUrl(wxPayV3Bean.getNotifyUrl());
        prepayRequest.setDescription(req.getDescription());
        prepayRequest.setOutTradeNo(tradeNo);
        prepayRequest.setAttach(req.getOrderType());
        //根據(jù)token拿到openid,指定該預(yù)支付訂單的支付者身份
        String token = request.getHeader("token");
        Map<String, Object> openMap = wechatUserMapper.getOpenIdByToken(token);
        Payer payer = new Payer();
        payer.setOpenid(openMap.get("openId").toString());
        prepayRequest.setPayer(payer);

        // 調(diào)用下單方法,得到應(yīng)答
        PrepayResponse response = service.prepay(prepayRequest);
        Map<String, Object> params = new HashMap<>();
        Long timeStamp = System.currentTimeMillis() / 1000;
        params.put("timeStamp", timeStamp);
        String substring = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
        params.put("nonceStr", substring);
        String signatureStr = Stream.of(wxPayV3Bean.getAppId(), String.valueOf(timeStamp), substring, "prepay_id=" + response.getPrepayId())
                .collect(Collectors.joining("\n", "", "\n"));
        String sign = WXPayUtil.getSign(signatureStr, wxPayV3Bean.getKeyPath());
        params.put("paySign", sign);
        params.put("package", "prepay_id=" + response.getPrepayId());
        params.put("tradeNo", tradeNo);
        log.info("-----------------------調(diào)用下單方法應(yīng)答對象:" + params);

        //保存訂單信息
        try {
            String accountUserId = accountUserMapper.getAccountUserId(req.getAccountNumber().toString());
            Map<String, Object> orderMap = new HashMap<>();
            orderMap.put("id", IdTool.getIdStr());
            orderMap.put("accountUserId", accountUserId);
            orderMap.put("appUserId", openMap.get("id"));
            orderMap.put("payOpenId", openMap.get("openId"));
            orderMap.put("orderType", req.getOrderType());
            orderMap.put("orderDate", DateUtil.getTime());
            orderMap.put("orderStatus", "0");
            orderMap.put("orderPrice", req.getAmount());
            orderMap.put("prepayId", response.getPrepayId());
            orderMap.put("tradeNo", tradeNo);
            log.info("-----------------------本次支付訂單信息:" + orderMap);
            orderMapper.insertOrder(orderMap);
            return ApiResponseBody.defaultSuccess(params);
        } catch (Exception e) {
            throw new ApiException(e.toString());
        }
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public ApiResponseBody  payNotify(HttpServletRequest request) throws Exception {
        //讀取請求體的信息
        ServletInputStream inputStream = request.getInputStream();
        StringBuffer stringBuffer = new StringBuffer();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s;
        //讀取回調(diào)請求體
        while ((s = bufferedReader.readLine()) != null) {
            stringBuffer.append(s);
        }
        String s1 = stringBuffer.toString();
        String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP);
        String nonce = request.getHeader(WECHAT_PAY_NONCE);
        String signType = request.getHeader("Wechatpay-Signature-Type");
        String serialNo = request.getHeader(WECHAT_PAY_SERIAL);
        String signature = request.getHeader(WECHAT_PAY_SIGNATURE);
        // 如果已經(jīng)初始化了 RSAAutoCertificateConfig,可直接使用
        // 沒有的話,則構(gòu)造一個
        NotificationConfig config = new RSAAutoCertificateConfig.Builder()
                .merchantId(wxPayV3Bean.getMchId())
                .privateKeyFromPath(wxPayV3Bean.getKeyPath())
                .merchantSerialNumber(wxPayV3Bean.getMchSerialNo())
                .apiV3Key(wxPayV3Bean.getApiKey())
                .build();
        // 初始化 NotificationParser
        NotificationParser parser = new NotificationParser(config);
        RequestParam requestParam = new RequestParam.Builder()
                .serialNumber(serialNo)
                .nonce(nonce)
                .signature(signature)
                .timestamp(timestamp)
                // 若未設(shè)置signType,默認(rèn)值為 WECHATPAY2-SHA256-RSA2048
                .signType(signType)
                .body(s1)
                .build();
        Transaction parse = parser.parse(requestParam, Transaction.class);
        log.info("-----------------------parse = " + parse);

        try {
            String status = orderMapper.queryPayOrderStatus(parse.getOutTradeNo().toString());
            if (status.equals("1")) {
                log.info("-----------------------該訂單:" + parse.getOutTradeNo() + "已經(jīng)進行回調(diào),不可重復(fù)回調(diào)");
                return ApiResponseBody.defaultSuccess();
            }
            updateAccountDetail(parse);
        } catch (Exception e) {
            throw new ApiException(e.toString());
        }
        log.info("-----------------------回調(diào)完成-----------------------");
        return ApiResponseBody.defaultSuccess();
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public ApiResponseBody queryPayOrder(String tradeNo) {
         String status = orderMapper.queryPayOrderStatus(tradeNo);
         if (status.equals("1")) {
             return ApiResponseBody.defaultSuccess("SUCCESS");
         }
        // 使用自動更新平臺證書的RSA配置,配置微信支付的自動證書管理功能
        Config config =
                new RSAAutoCertificateConfig.Builder()
                        .merchantId(wxPayV3Bean.getMchId())
                        .privateKeyFromPath(wxPayV3Bean.getKeyPath())
                        .merchantSerialNumber(wxPayV3Bean.getMchSerialNo())
                        .apiV3Key(wxPayV3Bean.getApiKey())
                        .build();
        // 構(gòu)建service,用于處理JSAPI支付相關(guān)的操作
        JsapiService service = new JsapiService.Builder().config(config).build();

        //根據(jù)商戶訂單號查詢支付訂單
        QueryOrderByOutTradeNoRequest queryRequest = new QueryOrderByOutTradeNoRequest();
        queryRequest.setMchid(wxPayV3Bean.getMchId());
        queryRequest.setOutTradeNo(tradeNo);
        Transaction transaction = service.queryOrderByOutTradeNo(queryRequest);
        log.info("-----------------------支付狀態(tài):" + transaction.getTradeState());
        updateAccountDetail(transaction);
        return ApiResponseBody.defaultSuccess(transaction.getTradeState().toString());
    }

    /**
     * 時間+id為訂單號
     * @param
     * @return
     */
    public String getTradeNo() {
        String idStr = IdTool.getIdStr();
        long timestamp = DateUtil.getDate();
//        //序列號是為了保證同一毫秒內(nèi)生成的訂單號的唯一性
//        AtomicInteger sequence = new AtomicInteger(0);
//        int nextSequence = sequence.getAndIncrement();
//
        try {
//            MessageDigest md = MessageDigest.getInstance("MD5");
//            byte[] messageDigest = md.digest(String.valueOf(nextSequence).getBytes());
//
//            BigInteger no = new BigInteger(1, messageDigest);
//            String encrypted = no.toString(10); // 將十六進制轉(zhuǎn)為十進制表示的字符串
//
//            // 如果加密結(jié)果長度超過20位,則截取前20位
//            if (encrypted.length() > 20) {
//                encrypted = encrypted.substring(0, 20);
//            }
            String tradeNo = timestamp + idStr;
            return tradeNo;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public void updateAccountDetail(Transaction parse) {
        //更新訂單狀態(tài)
        Map<String, Object> map = new HashMap<>();
        map.put("tradeNo", parse.getOutTradeNo().toString());
        map.put("transactionId", parse.getTransactionId().toString());
        orderMapper.updateOrderStatus(map);
        //保存充值流水賬單
        String outTradeNo = parse.getOutTradeNo();
        Map<String, Object> accountMap = accountUserMapper.getAccountUser(outTradeNo);
        Map<String, Object> billMap = new HashMap<>();
        billMap.put("id", IdTool.getIdStr());
        billMap.put("amount", parse.getAmount().getTotal());
        billMap.put("accountUserId", accountMap.get("accountUserId"));
        billMap.put("payOrderId", accountMap.get("payOrderId"));
        billMap.put("agoBalance", accountMap.get("balance"));
        billMap.put("createDate", DateUtil.getTime());
        billMap.put("laterBalance", BigDecimal.valueOf(parse.getAmount().getTotal()).add(BigDecimal.valueOf(Integer.valueOf(accountMap.get("balance").toString()))));
        billMap.put("billType", "pay");
        billMap.put("tradeType", "wechat-applet");
        log.info("-----------------------本次支付流水賬單信息:" + billMap);
        orderMapper.insertBillLog(billMap);

        //更新戶號的余額
        Map<String, Object> accountUserMap = new HashMap<>();
        accountUserMap.put("accountUserId", accountMap.get("accountUserId"));
        accountUserMap.put("balance", Long.valueOf(parse.getAmount().getTotal()) + Long.valueOf(accountMap.get("balance").toString()));
        accountUserMapper.updateBalance(accountUserMap);
    }
}

后面具體dao層xml里的sql就不具體寫了。?

注意:這里有個特別大的一個坑,大家一定要注意。JSONObject千萬要引fastjson2的包

微信支付 apiv3 java,微信小程序,微信,小程序,java,spring cloud,spring boot

至此完成!! 歡迎評論區(qū)討論指出不足一起進步!!

做一個挑戰(zhàn)風(fēng)車的傻子,魯莽也比怯懦更接近勇敢!文章來源地址http://www.zghlxwxcb.cn/news/detail-768134.html

到了這里,關(guān)于【微信小程序】Java實現(xiàn)微信支付(小程序支付JSAPI-V3)java-sdk工具包的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 微信小程序JSAPI下單支付PHP前后端教程

    微信小程序JSAPI下單支付PHP前后端教程

    準(zhǔn)備數(shù)據(jù): 微信支付API證書,微信支付商戶號,小程序appid,微信支付API證書序列號 獲取微信支付api證書教程:如何下載微信支付證書(API證書)_荒~的博客-CSDN博客_微信支付證書 獲取微信支付API證書序列號:點擊管理證書即可看到 ? 第一步:生成預(yù)支付交易單 參考文檔:

    2024年02月11日
    瀏覽(20)
  • 微信小程序拉起支付報: 調(diào)用支付JSAPI缺少參數(shù): total_fee
  • 微信小程序demo 調(diào)用支付jsapi缺少參數(shù) total_fee,支付簽名驗證失敗 究極解決方案

    其中package: ‘prepay_id=’ + data.prepayId,這一行代碼,必須拼接‘prepay_id=’ 文檔官方文檔: https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/jsapi-transfer-payment.html 注意看,后臺生成sign時候,拼接的字符串中,也需要加上\\\"prepay_id=\\\" app支付和小程序支付的代碼之前還有這種差別和坑…

    2024年02月04日
    瀏覽(22)
  • java對接微信支付:JSAPI支付(微信公眾號支付)

    java對接微信支付:JSAPI支付(微信公眾號支付)

    本文是【微信JSAPI支付】文章,主要講解商戶對接微信支付,簡潔版測試 文章目錄 一、JSAPI支付接入前準(zhǔn)備 二、代碼片段 1.引入Maven依賴 2.后端業(yè)務(wù)請求接口 3.前端調(diào)起支付請求方法 總結(jié) 1、JSAPI支付首先需要注冊、認(rèn)證一個公眾號(大概300塊一年) 微信公眾號注冊 2、申請成為

    2024年02月08日
    瀏覽(30)
  • Java實現(xiàn)微信小程序V3支付

    Java實現(xiàn)微信小程序V3支付

    2024年02月12日
    瀏覽(27)
  • java對接微信支付:JSAPI支付成功之“微信回調(diào)”

    承接上一篇微信支付,現(xiàn)在簡單說一下 微信支付回調(diào) 目錄 一、支付回調(diào) 二、微信回調(diào)地址問題 1.本地/上線測試 2.控制器調(diào)用接口(代碼) 總結(jié) 當(dāng)用戶支付成功之后,支付平臺會向我們指定的服務(wù)器接口發(fā)送請求傳遞訂單支付狀態(tài)數(shù)據(jù) 如果你是再本地進行測試,那就需要使用

    2024年02月12日
    瀏覽(31)
  • 微信小程序基于java實現(xiàn)v2支付,提現(xiàn),退款

    微信小程序基于java實現(xiàn)v2支付,提現(xiàn),退款

    v2微信官方文檔 封裝支付請求實體 controller接口暴露層 payFoodOrder 支付接口實現(xiàn)類 獲取請求ip wxform.setNotifyUrl(WechatUtil.getPayNotifyUrl() + WXPAY_NOTIFY_URL_FOOD_ORDER); 這個回調(diào)地址是你自己代碼里面定義的回調(diào)接口,例如你定義的controller回調(diào)接口url是 feedback/wx/notifurl , 即是 wxform.setNoti

    2024年02月09日
    瀏覽(24)
  • Java實現(xiàn)微信小程序V3支付 (完整demo)
  • 微信支付(JSAPI支付)/支付寶支付(手機網(wǎng)站支付)實現(xiàn)思路及實現(xiàn)方案-無源碼

    微信支付(JSAPI支付)/支付寶支付(手機網(wǎng)站支付)實現(xiàn)思路及實現(xiàn)方案-無源碼

    停車系統(tǒng) 一個二維碼同時支持微信及支付寶掃碼付款,使用手機網(wǎng)站實現(xiàn) 臨時車費用繳費二維碼需要通知支持微信及支付寶。 用戶繳納的停車費直接到各個商戶的賬戶上,不經(jīng)過停車系統(tǒng)開發(fā)公司。 微信:使用微信服務(wù)商提供的服務(wù) 支付寶:使用支付服務(wù)商提供的服務(wù) 兩

    2024年02月09日
    瀏覽(26)
  • 【微信支付】springboot-java接入微信支付-JSAPI支付/查單/退款/發(fā)送紅包(三)---退款

    【微信支付】springboot-java接入微信支付-JSAPI支付/查單/退款/發(fā)送紅包(三)---退款

    微信支付開發(fā)文檔:https://pay.weixin.qq.com/docs/merchant/apis/jsapi-payment/create.html 退款與查單的請求頭類似,但是查單是GET請求,所以在構(gòu)造簽名的時候相對簡單些,但是退款請求中有請求參數(shù),在構(gòu)造簽名時,需要將請求體添加到請求頭參數(shù)中。 1、構(gòu)造請求參數(shù) 查看微信支付開

    2024年01月19日
    瀏覽(34)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包