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

微信支付(小程序)-java實(shí)現(xiàn)與小程序?qū)崿F(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了微信支付(小程序)-java實(shí)現(xiàn)與小程序?qū)崿F(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一:java配置

微信支付(小程序)-java配置

二:工具類:獲取本地IP與Enum類 與訂單支付返回?cái)?shù)據(jù)

1: 獲取本地IP工具類
2:訂單 Enum類

package com.io.common.enums;

public enum OrderStatusEnum {
    CANCEL(0,"已取消"),
    NOT_YET_SHIPPED(1,"待支付"),
    PART_OF_THE_SHIPMENT(2,"待發(fā)貨"),
    WAIT_RECEIVING(3,"待收貨"),
    ACHIEVE(4,"已完成"),
    ;
    private Integer key;
    private String desc;

    OrderStatusEnum(Integer key, String desc){
        this.key = key;
        this.desc = desc;
    }

    public Integer getKey() {
        return key;
    }

    public String getDesc() {
        return desc;
    }
}

3:支付方式Enum類

package com.io.common.enums;

public enum PayTypeEnum {

    WX_PAY(1, "微信支付"),

    ;

    private Integer key;
    private String desc;

    PayTypeEnum(Integer key, String desc) {
        this.key = key;
        this.desc = desc;
    }

    public Integer getKey() {
        return key;
    }

    public String getDesc() {
        return desc;
    }

    public static String getDesc(Integer key) {
        for (PayTypeEnum c : PayTypeEnum.values()) {
            if (c.key.equals(key)) {
                return c.getDesc();
            }
        }
        return null;
    }
}

4:微信支付form提交數(shù)據(jù)

package com.io.order.form;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;

/**
 * @author ts
 * @version 1.0
 * @date 2022/08/05
 */
@Data
public class WxPayForm {

    private Integer orderId;

    @ApiModelProperty("訂單號(hào)")
    private String orderNo;

    @ApiModelProperty("支付訂單號(hào)")
    private String orderPayNo;

    @ApiModelProperty("實(shí)際支付金額")
    private BigDecimal payAmount;


}

5:微信支付訂單返回?cái)?shù)據(jù)

package com.io.order.vo;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;


@Data
public class AfterPayVO {

    @ApiModelProperty("timeStamp")
    private String timeStamp;

    @ApiModelProperty("nonceStr")
    private String nonceStr;

    @ApiModelProperty("packageValue")
    private String packageValue;

    @ApiModelProperty("signType")
    private String signType;

    @ApiModelProperty("paySign")
    private String paySign;
}

三:service與controller

1:支付 service類

package com.io.order.service;

import com.github.binarywang.wxpay.exception.WxPayException;
import com.io.order.form.WxPayForm;
import com.io.order.vo.AfterPayVO;

import javax.servlet.http.HttpServletResponse;

public interface PayService {

    /**
     * 微信支付
     * @param form 訂單數(shù)據(jù)
     * @param userId // 用戶id
     * @param wxId // 微信用戶id
     * @return
     * @throws
     */
    AfterPayVO pay(WxPayForm form, String userId,Integer wxId) throws WxPayException;

    /**
     * 微信支付回調(diào)
     * @param appid
     * @param xmlData
     * @param response
     * @throws Exception
     */
    void payNotify(String appid, String xmlData, HttpServletResponse response) throws Exception;
}

2:支付 service類實(shí)現(xiàn)

package com.io.order.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import com.io.common.enums.OrderStatusEnum;
import com.io.common.enums.PayTypeEnum;
import com.io.entity.WxUserEntity;
import com.io.exception.RRException;
import com.io.order.config.WxPayProperties;
import com.io.order.dao.OrderDao;
import com.io.order.entity.OrderEntity;
import com.io.order.form.WxPayForm;
import com.io.order.service.PayService;
import com.io.order.vo.AfterPayVO;
import com.io.order.vo.RefundVO;
import com.io.service.WxUserService;
import com.io.util.ConvertUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.time.LocalDateTime;
import java.util.Objects;

@Service
@Slf4j
public class PayServiceImpl implements PayService {

    @Autowired
    private WxUserService wxUserService;

    @Value("${he.wx.appid}")
    private String wxAppid;

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    @Override
    public AfterPayVO pay(WxPayForm form, String userId, Integer wxId) throws WxPayException {
        // 查詢根據(jù)微信id(存微信用戶表的id)查詢MySQL數(shù)據(jù)庫(kù)獲取當(dāng)前用戶的微信數(shù)據(jù)
        WxUserEntity byId = wxUserService.getById(wxId);
        if (Objects.isNull(byId)){
            log.info("微信支付用戶wxId:" + wxId);
            throw new RRException("無(wú)該微信用戶");
        }
        WxPayService wxPayService = this.getWxPayService(wxAppid);

        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
        orderRequest.setBody("商品付款");
        orderRequest.setOutTradeNo(form.getOrderPayNo());
        orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(form.getPayAmount().toString()));//元轉(zhuǎn)成分
        orderRequest.setOpenid(byId.getXwOpenId()); // 支付微信用戶 微信openId
        orderRequest.setSpbillCreateIp(IpUtils.getAddrIp()); // 本地ip設(shè)置
        orderRequest.setSpbillCreateIp("114.55.114.66");
        orderRequest.setNotifyUrl(String.format(properties.getNotifyUrl(), "payNotify", byId.getXwOpenId())); // 支付回調(diào)路徑與參數(shù)拼接設(shè)置
        // 支付方式
        orderRequest.setTradeType("JSAPI");

        orderRequest.setAppid(wxAppid);

        Object result = wxPayService.createOrder(orderRequest);
        AfterPayVO afterPayVO = ConvertUtils.sourceToTarget(result, AfterPayVO.class);
        return afterPayVO;
    }

    @Override
    public void payNotify(String appid, String xmlData, HttpServletResponse response) throws Exception {

        WxPayService wxPayService = this.getWxPayService(appid);
        final WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
        log.info("支付訂單號(hào):" + notifyResult.getOutTradeNo());

        // 小程序支付成功后回調(diào)這個(gè)接口 后的訂單業(yè)務(wù)邏輯 (請(qǐng)根據(jù)項(xiàng)目來(lái)編寫(xiě))
        LambdaQueryWrapper<OrderEntity> lambdaQueryWrapper =new LambdaQueryWrapper<OrderEntity>();
        lambdaQueryWrapper.eq(OrderEntity::getOrderPayNo,notifyResult.getOutTradeNo());
        OrderEntity orderEntity = orderDao.selectOne(lambdaQueryWrapper);
        //訂單狀態(tài)
        if (OrderStatusEnum.NOT_YET_SHIPPED.getKey().equals(orderEntity.getOrderStatus())){
            orderEntity.setOrderStatus(OrderStatusEnum.PART_OF_THE_SHIPMENT.getKey());
            orderEntity.setPaymentType(PayTypeEnum.WX_PAY.getKey());
            orderEntity.setPaymentTime(LocalDateTime.now());
            orderDao.updateById(orderEntity);
        }

        //回復(fù)微信防止重復(fù)回調(diào)
        StringBuilder resXml = new StringBuilder();
        resXml.append("<xml>");
        resXml.append("<return_code><![CDATA[SUCCESS]]></return_code>");
        resXml.append("<return_msg><![CDATA[OK]]></return_msg>");
        resXml.append("</xml>");
        BufferedOutputStream out = new BufferedOutputStream(response.getOutputStream());
        out.write(resXml.toString().getBytes());
        out.flush();
        out.close();
    }
    
    /** 獲取商戶號(hào)配置并生成 WxPayService 
     * getWxPayService
     * @param appid
     * @return
     */
    private WxPayService getWxPayService(String appid){
        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setAppId(appid);
        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
        // 可以指定是否使用沙箱環(huán)境
        payConfig.setUseSandboxEnv(false);

        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        return wxPayService;
    }
}

3: Controller類

package com.io.order.controller;

import com.io.base.BaseController;
import com.io.order.service.PayService;
import com.io.util.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletResponse;

@RestController
@RequestMapping("/pay")
@Api(tags = "支付接口")
@Slf4j
public class PayController{

    @Autowired
    private PayService payService;

    @PostMapping("/payNotify/{appid}")
    @ApiOperation("支付回調(diào)")
    public R payNotify(@PathVariable String appid, @RequestBody String xmlData, HttpServletResponse response) throws Exception {
        payService.payNotify(appid, xmlData, response);
        return R.ok();
    }

三:小程序調(diào)用 支付接口

官方文檔:wx.requestPayment

注:res.data.purchase  是先走下單邏輯(去后臺(tái)下單并且調(diào)用了 支付接口)
返回參數(shù): AfterPayVO;
小程序前端所用到的參數(shù)是 訂單支付返回的參數(shù)
wx.requestPayment({
  timeStamp: res.data.purchase.timeStamp,
  nonceStr: res.data.purchase.nonceStr,
  package: res.data.purchase.packageValue,
  signType: 'MD5',
  paySign: res.data.purchase.paySign,
  success (res) {
    支付成功
  },
  fail (res) {
    支付取消或失敗
  }
})

2: 開(kāi)發(fā)工具中測(cè)試支付接口 所展示的樣子

3:正式環(huán)境樣式

微信小程序支付功能怎么實(shí)現(xiàn)java,小程序,java,微信,小程序文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632910.html

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

本文來(lái)自互聯(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實(shí)現(xiàn)微信小程序V3微信支付功能

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

    2024年02月12日
    瀏覽(99)
  • 全網(wǎng)最詳細(xì)實(shí)現(xiàn)微信小程序支付功能【前端部分】

    全網(wǎng)最詳細(xì)實(shí)現(xiàn)微信小程序支付功能【前端部分】

    用戶點(diǎn)擊立即購(gòu)買(mǎi)后進(jìn)入確認(rèn)訂單頁(yè)面,在此頁(yè)面可選擇商品數(shù)量,是否使用優(yōu)惠券,以及一些簡(jiǎn)單的個(gè)人信息填寫(xiě),點(diǎn)擊支付輸入密碼則支付成功,如果點(diǎn)擊支付后沒(méi)有付款關(guān)閉了頁(yè)面會(huì)跳轉(zhuǎn)到待支付頁(yè)面并開(kāi)始倒計(jì)時(shí)(待支付頁(yè)面顯示該商品適用的店鋪信息及個(gè)人信息訂

    2024年02月11日
    瀏覽(33)
  • 【uni-app微信小程序】實(shí)現(xiàn)支付功能

    實(shí)現(xiàn)微信支付功能需要在小程序后臺(tái)配置支付相關(guān)信息,并且在前端代碼中調(diào)用微信支付API進(jìn)行支付操作。好的, uni-app微信小程序?qū)崿F(xiàn)支付功能整體流程 大致如下: 注冊(cè)微信公眾平臺(tái),并完成開(kāi)發(fā)者資質(zhì)認(rèn)證; 在微信商戶平臺(tái)注冊(cè)商戶賬號(hào),并完成商戶資質(zhì)認(rèn)證; 在商戶

    2024年02月13日
    瀏覽(114)
  • 【Node.js】實(shí)現(xiàn)微信小程序在線支付功能

    【Node.js】實(shí)現(xiàn)微信小程序在線支付功能

    實(shí)戰(zhàn)項(xiàng)目名稱:微信小程序?qū)崿F(xiàn)在線支付功能 - 文章結(jié)尾附上微信小程序碼,掃碼登錄后即可體驗(yàn)!! 注意:對(duì)接 微信支付 功能,必須得先有微信支付的 商戶號(hào) ,不然你是測(cè)試不了微信支付功能的。 原因: 微信官網(wǎng)不提供微信支付的測(cè)試賬號(hào) 微信支付一切都以商戶號(hào)為

    2024年02月09日
    瀏覽(97)
  • 使用云開(kāi)發(fā)環(huán)境的云函數(shù)實(shí)現(xiàn)微信小程序的支付功能

    使用云開(kāi)發(fā)環(huán)境的云函數(shù)實(shí)現(xiàn)微信小程序的支付功能

    背景: 近期在開(kāi)發(fā)一個(gè)商城類的微信小程序,因?yàn)楸救酥粫?huì)使用 C 語(yǔ)言對(duì) nodejs 環(huán)境不熟悉,因此在開(kāi)發(fā)微信小程序時(shí)選用容易上手的云開(kāi)發(fā)環(huán)境開(kāi)發(fā)微信小程序。我想選用云開(kāi)發(fā)環(huán)境的小伙伴和我的想法一致,對(duì)微信小程序開(kāi)發(fā)相關(guān)知識(shí)了解很少。我的小程序的主體是個(gè)體

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

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

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

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

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

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

    2024年02月09日
    瀏覽(26)
  • Java實(shí)現(xiàn)微信小程序V3支付 (完整demo)
  • SpringBoot對(duì)接微信小程序支付功能開(kāi)發(fā)(二,支付回調(diào)功能)

    SpringBoot對(duì)接微信小程序支付功能開(kāi)發(fā)(二,支付回調(diào)功能)

    接著上一篇: SpringBoot對(duì)接微信小程序支付功能開(kāi)發(fā)(一,下單功能) 在上一篇下單功能中我們有傳支付結(jié)果回調(diào)地址。 下面是回調(diào)接口實(shí)現(xiàn) 根據(jù)官網(wǎng)給的參數(shù)進(jìn)行業(yè)務(wù)處理 這就完成了,微信支付回調(diào)你的地址,并且把支付的信息傳進(jìn)來(lái),剩下就要根據(jù)自己業(yè)務(wù)進(jìn)行操作。

    2024年02月11日
    瀏覽(63)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包