返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java 实现微信支付详细教程
  • 654
分享到

Java 实现微信支付详细教程

java微信开发语言 2023-08-19 15:08:55 654人浏览 泡泡鱼
摘要

摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路。 一、微信支付接入准备工作: 首先,微信支付,只支持企业用户,个人用户是不能

摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路。

一、微信支付接入准备工作:

首先,微信支付,只支持企业用户,个人用户是不能接入微信支付的,所以要想接入微信支付,首先需要有微信公众号,这个的企业才能申请。有了微信公众号,就能申请微信支付的相关内容,所以在准备开始写代码之前需要先把下面的这些参数申请好:公众账号ID、微信支付商户号、api密钥、AppSecret是APPID对应的接口密码、回调地址(回调必须保证外网能访问到此地址)、发起请求的电脑IP

二、微信支付流程说明:

有了上面提到的这些参数,那我们就可以接入微信支付了,下面我来看下微信支付的官方文档(https://pay.weixin.qq.com/wiki/doc/api/index.html)、访问该地址可以看到有多种支付方式可以选择,我们这里选择扫码支付的方式(Https://pay.weixin.qq.com/wiki/doc/api/native.PHP?chapter=6_1)

这里我们选择模式二,下面看下模式二的时序图,如下图:

模式二与模式一相比,流程更为简单,不依赖设置的回调支付URL。商户后台系统先调用微信支付的统一下单接口,微信后台系统返回链接参数code_url,商户后台系统将code_url值生成二维码图片,用户使用微信客户端扫码后发起支付。注意:code_url有效期为2小时,过期后扫码不能再发起支付。

在这里插入图片描述

三、微信支付所需Maven依赖

            <dependency>            <groupId>com.GitHub.wechatpay-apiv3groupId>            <artifactId>wechatpay-apache-httpclientartifactId>            <version>0.3.0version>        dependency>                <dependency>            <groupId>com.Google.code.gsongroupId>            <artifactId>gsonartifactId>            <version>2.8.6version>        dependency>        <dependency>            <groupId>org.apache.httpcomponentsgroupId>            <artifactId>httpclientartifactId>            <version>4.5.12version>        dependency>                <dependency>            <groupId>com.google.zxinggroupId>            <artifactId>coreartifactId>            <version>3.3.3version>        dependency>                <dependency>            <groupId>com.google.zxinggroupId>            <artifactId>javaseartifactId>            <version>3.3.3version>        dependency>

四、配置文件添加微信支付所需参数

# 微信支付相关参数wxpay:  # 商户号  mch-id: xxxxxxx  # 商户API证书序列号  mch-serial-no: xxxxxxxxxx  # 商户私钥文件  # 注意:该文件放在项目根目录下  private-key-path: ./apiclient_key.pem  # APIv3密钥  api-v3-key: xxxxxxxx  # APPID  appid: xxxxxxc27e0e7cxxx  # 微信服务器地址  domain: https://api.mch.weixin.qq.com  # 接收结果通知地址  # 注意:每次重新启动ngrok,都需要根据实际情况修改这个配置  notify-domain: https://c7c1-240e-3b5-3015-be0-1bc-9bed-fca4-d09b.ngrok.io

五、微信支付下单代码实现

1.Controller层

     @ApiOperation(value = "native 微信支付下单 返回Image")    @GetMapping("/native")    public BaseRes<String> nativePay(@RequestParam("packageId") Integer packageId) {        return wxPayService.nativePay(packageId);    }      @ApiOperation(value = "jsAPI微信支付下单")    @GetMapping("/jsapi")    public BaseRes<String> jsapiPay(@RequestParam("packageId") Integer packageId,@RequestParam("openId") String openId) {        return wxPayService.jsapiPay(packageId,openId);    }

注意:packageId是套餐Id,可根据情况修改

2.Service层

   BaseRes<String> nativePay(Integer packageId);      BaseRes<String> jsapiPay(Integer packageId, String openId);

3.实现层

        @Transactional(rollbackFor = Exception.class)    @Override    @SneakyThrows    public BaseRes<String> nativePay(Integer packageId){        log.info("发起Navicat支付请求");        HttpPost httpPost = new HttpPost(wxPayConfig.getDomain().concat(WxApiType.NATIVE_PAY.getType()));        CloseableHttpResponse response = wxPayExecute(packageId, null, httpPost);        try {            String bodyAsString = EntityUtils.toString(response.getEntity());//响应体            int statusCode = response.getStatusLine().getStatusCode();//响应状态码            if (statusCode == 200) { //处理成功                log.info("成功, 返回结果 = " + bodyAsString);            } else if (statusCode == 204) { //处理成功,无返回Body                log.info("成功");            } else {                log.info("Native下单失败,响应码 = " + statusCode + ",返回结果 = " + bodyAsString);                throw new IOException("request failed");            }            Gson gson = new Gson();            //响应结果            Map<String, String> resultMap = gson.fromJSON(bodyAsString, HashMap.class);            //二维码            String codeUrl = resultMap.get("code_url");            return new BaseRes<>(codeUrl,ServiceCode.SUCCESS);            //生成二维码//            WxPayUtil.makeQRCode(codeUrl);        } finally {            response.close();        }    }      @Override    @SneakyThrows    public BaseRes<String> jsapiPay(Integer packageId, String openId) {        log.info("发起Navicat支付请求");        HttpPost httpPost = new HttpPost(wxPayConfig.getDomain().concat(WxApiType.JSAPI_PAY.getType()));        CloseableHttpResponse response = wxPayExecute(packageId, openId, httpPost);        try {            String bodyAsString = EntityUtils.toString(response.getEntity());//响应体            int statusCode = response.getStatusLine().getStatusCode();//响应状态码            if (statusCode == 200) { //处理成功                log.info("成功, 返回结果 = " + bodyAsString);            } else if (statusCode == 204) { //处理成功,无返回Body                log.info("成功");            } else {                log.info("JSAPI下单失败,响应码 = " + statusCode + ",返回结果 = " + bodyAsString);                throw new IOException("request failed");            }            Gson gson = new Gson();            //响应结果            Map<String, String> resultMap = gson.fromJson(bodyAsString, HashMap.class);            String prepayId = resultMap.get("prepay_id");            return new BaseRes<>(prepayId,ServiceCode.SUCCESS);        } finally {            response.close();        }    } // 封装统一下单方法  private CloseableHttpResponse wxPayExecute(Integer packageId,String openId,HttpPost httpPost) throws IOException {        // 获取套餐金额 还有相关信息        ChatPackage chatPackage = chatPackageMapper.selectById(packageId);        if (null == chatPackage) {            throw new NingException(ServiceCode.FAILED);        }        BigDecimal amount = chatPackage.getAmount();        if (null == amount || amount.equals(BigDecimal.ZERO)) {            throw new NingException(ServiceCode.SUCCESS);        }// 从登录信息中获取用户信息        TokenUser loginUserInfo = CommUtils.getLoginUserInfo();        Integer userId = loginUserInfo.getUserId();        // 请求body参数        Gson gson = new Gson();        Map<String,Object> paramsMap = new HashMap<>();        paramsMap.put("appid", wxPayConfig.getAppid());        paramsMap.put("mchid", wxPayConfig.getMchId());        paramsMap.put("description", chatPackage.getName());        paramsMap.put("out_trade_no", WxPayUtil.generateOrderNumber(userId,packageId)); //订单号        paramsMap.put("notify_url", wxPayConfig.getNotifyDomain().concat(WxApiType.NATIVE_NOTIFY.getType()));        Map<String,Object> amountMap = new HashMap<>();        //由单位:元 转换为单位:分,并由Bigdecimal转换为整型        BigDecimal total = amount.multiply(new BigDecimal(100));        amountMap.put("total", total.intValue());        amountMap.put("currency", "CNY");        paramsMap.put("amount", amountMap);// 判断是Navicat下单还是JSAPI下单 JSAPI需要传OPENID        if (StringUtils.isNotBlank(openId)) {            Map<String,Object> payerMap = new HashMap<>();            payerMap.put("openid",openId);            paramsMap.put("payer",payerMap);        }        JSONObject attachJson = new JSONObject();        attachJson.put("packageId",packageId);        attachJson.put("userId",userId);        attachJson.put("total",total);        paramsMap.put("attach",attachJson.toJSONString());        //将参数转换成json字符串        String jsonParams = gson.toJson(paramsMap);        log.info("请求参数 ===> {}" , jsonParams);        StringEntity entity = new StringEntity(jsonParams, "utf-8");        entity.setContentType("application/json");        httpPost.setEntity(entity);        httpPost.setHeader("Accept", "application/json");        //完成签名并执行请求        return wxPayClient.execute(httpPost);    }

六、微信支付回调接口

1.Controller层

       @ApiOperation(value = "支付通知", notes = "支付通知")    @PostMapping("/pay/notify")    @ClientAuthControl    public WxRes nativeNotify() {        return wxPayService.nativeNotify();    }    

2.Service层

    WxRes nativeNotify();

3.实现层

@Resource    private Verifier verifier;        private final ReentrantLock lock = new ReentrantLock();    @Override    @SneakyThrows    @Transactional    public WxRes nativeNotify() {        HttpServletRequest request = CommUtils.getRequest();        HttpServletResponse response = CommUtils.getResponse();        Gson gson = new Gson();        try {            //处理通知参数            String body = WxPayUtil.readData(request);            Map<String, Object> bodyMap = gson.fromJson(body, HashMap.class);            String requestId = (String) bodyMap.get("id");            //签名的验证            WechatPay2ValidatorForRequest wechatPay2ValidatorForRequest                    = new WechatPay2ValidatorForRequest(verifier, requestId, body);            if (wechatPay2ValidatorForRequest.validate(request)) {                throw new RuntimeException();            }            log.info("通知验签成功");            //处理订单            processOrder(bodyMap);            return new WxRes("SUCCESS","成功");        } catch (Exception e) {            e.printStackTrace();            response.setStatus(500);            return new WxRes("FAIL","成功");        }    }       @Transactional    @SneakyThrows    public void processOrder(Map<String, Object> bodyMap){        log.info("处理订单");        //解密报文        String plainText = decryptFromResource(bodyMap);        //将明文转换成map        Gson gson = new Gson();        HashMap plainTextMap = gson.fromJson(plainText, HashMap.class);        String orderNo = (String) plainTextMap.get("out_trade_no");        String attach = (String) plainTextMap.get("attach");        JSONObject attachJson = JSONObject.parseObject(attach);        Integer packageId = attachJson.getInteger("packageId");        Integer userId = attachJson.getInteger("userId");        Integer total = attachJson.getInteger("total");                //尝试获取        // 成功获取则立即返回true,获取失败则立即返回false。不必一直等待锁的释放        if (lock.tryLock()) {            try {                log.info("plainText={}",plainText);                //处理重复的通知                //接口调用的幂等性:无论接口被调用多少次,产生的结果是一致的。                String orderStatus = orderService.getOrderStatus(orderNo);                if (!OrderStatus.NOTPAY.getType().equals(orderStatus)) {                    return;                }// TODO 修改订单状态、添加支付记录等  // 通知前端用户 已完成支付                messageSocketHandle.sendMessageByUserID(userId,new TextMessage("PaySuccess"));            } finally {                //要主动释放锁                lock.unlock();            }        }    }    @SneakyThrows    private String decryptFromResource(Map<String, Object> bodyMap) {        log.info("密文解密");        //通知数据        Map<String, String> resourceMap = (Map) bodyMap.get("resource");        //数据密文        String ciphertext = resourceMap.get("ciphertext");        //随机串        String nonce = resourceMap.get("nonce");        //附加数据        String associatedData = resourceMap.get("associated_data");        AesUtil aesUtil = new AesUtil(wxPayConfig.getApiV3Key().getBytes(StandardCharsets.UTF_8));        //数据明文        String plainText = aesUtil.decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),                nonce.getBytes(StandardCharsets.UTF_8),                ciphertext);        return plainText;    }

七、工具类和相关配置类

1.WxPayUtil工具类

@Slf4jpublic class WxPayUtil {    private static final Random random = new Random();// 生成订单号    public static String generateOrderNumber(int userId, int packageId) {        // 获取当前时间戳        long timestamp = System.currentTimeMillis();        // 生成6位随机数        int randomNum = random.nextInt(900000) + 100000;        // 组装订单号        return String.fORMat("%d%d%d%d", timestamp, randomNum, userId, packageId);    }        public static void makeQRCode(String url){        HttpServletResponse response = CommUtils.getResponse();        //通过支付链接生成二维码        HashMap<EncodeHintType, Object> hints = new HashMap<>();        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);        hints.put(EncodeHintType.MARGIN, 2);        try {            BitMatrix bitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 200, 200, hints);            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", response.getOutputStream());            System.out.println("创建二维码完成");        } catch (Exception e) {            e.printStackTrace();        }    }        public static String readData(HttpServletRequest request) {        BufferedReader br = null;        try {            StringBuilder result = new StringBuilder();            br = request.getReader();            for (String line; (line = br.readLine()) != null; ) {                if (result.length() > 0) {                    result.append("\n");                }                result.append(line);            }            return result.toString();        } catch (IOException e) {            throw new RuntimeException(e);        } finally {            if (br != null) {                try {                    br.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

2.微信支付配置类

@Configuration@ConfigurationProperties(prefix = "wxpay") //读取wxpay节点@Data //使用set方法将wxpay节点中的值填充到当前类的属性中@Slf4jpublic class WxPayConfig {    // 商户号    private String mchId;    // 商户API证书序列号    private String mchSerialNo;    // 商户私钥文件    private String privateKeyPath;    // APIv3密钥    private String apiV3Key;    // APPID    private String appid;    // 微信服务器地址    private String domain;    // 接收结果通知地址    private String notifyDomain;        private PrivateKey getPrivateKey(String filename) {        try {            return PemUtil.loadPrivateKey(new FileInputStream(filename));        } catch (FileNotFoundException e) {            throw new RuntimeException("私钥文件不存在", e);        }    }        @Bean    public ScheduledUpdateCertificatesVerifier getVerifier() {        log.info("获取签名验证器");        //获取商户私钥        PrivateKey privateKey = getPrivateKey(privateKeyPath);        //私钥签名对象        PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);        //身份认证对象        WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);        // 使用定时更新的签名验证器,不需要传入证书        ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(                wechatPay2Credentials,                apiV3Key.getBytes(StandardCharsets.UTF_8));        return verifier;    }        @Bean(name = "wxPayClient")    public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier) {        log.info("获取httpClient");        //获取商户私钥        PrivateKey privateKey = getPrivateKey(privateKeyPath);        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()                .withMerchant(mchId, mchSerialNo, privateKey)                .withValidator(new WechatPay2Validator(verifier));        // ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient        // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新        CloseableHttpClient httpClient = builder.build();        return httpClient;    }        @Bean(name = "wxPayNoSignClient")    public CloseableHttpClient getWxPayNoSignClient() {        //获取商户私钥        PrivateKey privateKey = getPrivateKey(privateKeyPath);        //用于构造HttpClient        WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()                //设置商户信息                .withMerchant(mchId, mchSerialNo, privateKey)                //无需进行签名验证、通过withValidator((response) -> true)实现                .withValidator((response) -> true);        // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新        CloseableHttpClient httpClient = builder.build();        log.info("== getWxPayNoSignClient END ==");        return httpClient;    }}

3.微信支付枚举类

@AllArgsConstructor@Getterpublic enum WxApiType {        NATIVE_PAY("/v3/pay/transactions/native"),        JSAPI_PAY("/v3/pay/transactions/jsapi"),        ORDER_QUERY_BY_NO("/v3/pay/transactions/out-trade-no/%s"),        CLOSE_ORDER_BY_NO("/v3/pay/transactions/out-trade-no/%s/close"),        NATIVE_NOTIFY("/client/order/pay/notify");        private final String type;}

4.签名验证类

@Slf4jpublic class WechatPay2ValidatorForRequest {        protected static final long RESPONSE_EXPIRED_MINUTES = 5;    protected final Verifier verifier;    protected final String requestId;    protected final String body;    public WechatPay2ValidatorForRequest(Verifier verifier, String requestId, String body) {        this.verifier = verifier;        this.requestId = requestId;        this.body = body;    }    protected static IllegalArgumentException parameterError(String message, Object... args) {        message = String.format(message, args);        return new IllegalArgumentException("parameter error: " + message);    }    protected static IllegalArgumentException verifyFail(String message, Object... args) {        message = String.format(message, args);        return new IllegalArgumentException("signature verify fail: " + message);    }    public final boolean validate(HttpServletRequest request) throws IOException {        try {            //处理请求参数            validateParameters(request);            //构造验签名串            String message = buildMessage(request);            String serial = request.getHeader(WECHAT_PAY_SERIAL);            String signature = request.getHeader(WECHAT_PAY_SIGNATURE);            //验签            if (!verifier.verify(serial, message.getBytes(StandardCharsets.UTF_8), signature)) {                throw verifyFail("serial=[%s] message=[%s] sign=[%s], request-id=[%s]",                        serial, message, signature, requestId);            }        } catch (IllegalArgumentException e) {            log.error(e.getMessage());            return false;        }        return true;    }    protected final void validateParameters(HttpServletRequest request) {        // NOTE: ensure HEADER_WECHAT_PAY_TIMESTAMP at last        String[] headers = {WECHAT_PAY_SERIAL, WECHAT_PAY_SIGNATURE, WECHAT_PAY_NONCE, WECHAT_PAY_TIMESTAMP};        String header = null;        for (String headerName : headers) {            header = request.getHeader(headerName);            if (header == null) {                throw parameterError("empty [%s], request-id=[%s]", headerName, requestId);            }        }        //判断请求是否过期        String timestampStr = header;        try {            Instant responseTime = Instant.ofEpochSecond(Long.parseLong(timestampStr));            // 拒绝过期请求            if (Duration.between(responseTime, Instant.now()).abs().toMinutes() >= RESPONSE_EXPIRED_MINUTES) {                throw parameterError("timestamp=[%s] expires, request-id=[%s]", timestampStr, requestId);            }        } catch (DateTimeException | NumberFormatException e) {            throw parameterError("invalid timestamp=[%s], request-id=[%s]", timestampStr, requestId);        }    }    protected final String buildMessage(HttpServletRequest request) throws IOException {        String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP);        String nonce = request.getHeader(WECHAT_PAY_NONCE);        return timestamp + "\n"                + nonce + "\n"                + body + "\n";    }    protected final String getResponseBody(CloseableHttpResponse response) throws IOException {        HttpEntity entity = response.getEntity();        return (entity != null && entity.isRepeatable()) ? EntityUtils.toString(entity) : "";    }}

OK,齐活~

来源地址:https://blog.csdn.net/weixin_45444807/article/details/131673713

--结束END--

本文标题: Java 实现微信支付详细教程

本文链接: https://lsjlt.com/news/375619.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 实现微信支付详细教程
    摘要:最近的一个项目中涉及到了支付业务,其中用到了微信支付和支付宝支付,在做的过程中也遇到些问题,所以现在总结梳理一下,分享给有需要的人,也为自己以后回顾留个思路。 一、微信支付接入准备工作: 首先,微信支付,只支持企业用户,个人用户是不能...
    99+
    2023-08-19
    java 微信 开发语言
  • PHP实现微信支付流程(Native支付)
    最近项目需要做微信支付的功能,想着把流程以及遇到的坑记录下来 1.到微信商户平台中去开通Native支付(产品中心-Native支付-申请开通) 2.微信商户平台中下载证书以及设置api密钥(账户中心-api安全),查看指引中很详细的说...
    99+
    2023-08-31
    php 微信 Powered by 金山文档
  • Java对接微信支付(史上最详细)
    Java对接微信支付(史上最详细) 本文将介绍如何使用Java对接微信支付,包括获取支付参数、支付回调处理等步骤。本文适用于已经熟悉微信支付基本原理的读者。 开发环境 JDK 1.8MavenSpring Boot 2.x微信支付开发文档 ...
    99+
    2023-08-17
    java 微信 开发语言
  • 【微信支付】java-微信小程序支付-V3接口
    一、对接前准备 最开始需要在微信支付的官网注册一个商户; 在管理页面中申请关联小程序,通过小程序的 appid 进行关联;商户号和appid之间是多对多的关系 进入微信公众平台,功能-微信支付中确认关联 具体流程请浏览官方文档:接入前准备-...
    99+
    2023-10-27
    微信 微信小程序 小程序
  • Java接入微信支付超级详细教程——从入门到精通
    源码下载 源码获取:点击获取源码 本文介绍了“二维码付款”的代码。其他微信支付方式的代码都在源码中。 一、准备开发所需的账号以及配置信息 解释:想要接入微信支付我们需要两个玩意 ,一个是公众号/小程序/企业微信(开发用的),一个是微信支付商...
    99+
    2023-08-17
    微信 java 微信小程序
  • 微信小程序接入微信支付实现过程详解
    目录一、基本介绍二、配置信息三、编码实现四、流程总结一、基本介绍 1、支付场景:点击支付按钮唤起微信支付弹窗,输入正确密码后完成支付。 2、基本流程:点击支付按钮首先生成一个订单,然...
    99+
    2022-12-26
    小程序接入微信支付 微信小程序微信支付
  • java微信小程序支付
    这篇文章将为大家详细讲解有关java微信小程序支付,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java 微信小程序支付 前言 微信小程序支付是一种方便快捷的支付方式,它允许用户在微信小程序中直接进行支付...
    99+
    2024-04-02
  • 微信小程序支付java
    这篇文章将为大家详细讲解有关微信小程序支付java,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。微信小程序支付 Java 实现 微信小程序支付提供了便捷的支付机制,使开发者能够轻松地在其小程序中集成支付功...
    99+
    2024-04-02
  • 微信支付V3 小程序支付API Java版
    本文目的:快速接通微信支付V3 无需关注细节,实现支付功能,修改配置即可调用 文章目录 接入准备微信支付流程整理(小程序版)一、导入微信支付扩展包二、微信支付工具类1.签名工具类2.微信...
    99+
    2023-10-27
    微信 小程序 java
  • 微信小程序中如何实现微信支付
    微信支付是微信公众平台提供的一种在线支付服务,可以为用户提供快速、方便、安全的支付体验。而在微信小程序中实现微信支付,则可以为应用程序提供更多的功能和服务,提高用户体验和商业价值。因此,在本文中,我们将介绍如何在微信小程序中实现微信支付。 ...
    99+
    2023-08-16
    微信小程序 微信 小程序 前端 javascript
  • Android第三方微信支付教程
    做了微信支付,下载了Demo,发现和之前有所改动,v3.0的版本,也许有的朋友还在摸索,这里我已经成功支付,话不多说,直接进入主题: 一、首先要在微信开发平台注册账号,新增应用...
    99+
    2022-06-06
    微信支付 教程 Android
  • PHP 实现微信支付 JSAPI
    目录 一、首先我们来填个坑 1:支付验签失败 二、代码示例 1.请求参数配置 2.统一下单API 3.MakeSign 签名 4.ToXml 数组参数转xml 5.postXmlCurl 发送请求 6.FromXml 结果xml参数转数组 ...
    99+
    2023-09-12
    php 微信 微信公众平台
  • Python3微信支付(小程序支付)V3接口的实现
    起因: 因公司项目需要网上充值功能,从而对接微信支付,目前也只对接了微信支付的小程序支付功能,在网上找到的都是对接微信支付V2版本接口,与我所对接的接口版本不一致,无法使用,特此记录...
    99+
    2023-01-17
    Python3 微信支付V3接口 Python3 微信支付
  • 怎么用Java也实现微信和支付宝支付功能
    这篇文章主要介绍“怎么用Java也实现微信和支付宝支付功能”,在日常操作中,相信很多人在怎么用Java也实现微信和支付宝支付功能问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • java微信支付v3系列——5.微信支付成功回调
    目录 java微信支付v3系列——1.微信支付准备工作 java微信支付v3系列——2.微信支付基本配置 java微信支付v3系列——3.订单创建准备操作 java微信支付v3系列——4.创建订单的封...
    99+
    2023-09-06
    微信 java 微信支付 微信支付v3
  • java对接微信支付:JSAPI支付成功之“微信回调”
    承接上一篇微信支付,现在简单说一下 微信支付回调 目录 一、支付回调 二、微信回调地址问题 1.本地/上线测试 2.控制器调用接口(代码) 总结 一、支付回调 当用户支付成功之后,支付平台会向我们指定的服...
    99+
    2023-09-02
    微信
  • php实现微信支付功能
    一、生成预支付订单并获取预支付ID(prepay_id): ...
    99+
    2023-09-11
    php
  • vue项目中的支付功能实现(微信支付和支付宝支付)
    目录项目中常见的支付方式    支付宝支付微信支付项目中常见的支付方式     支付宝支付  &nbs...
    99+
    2024-04-02
  • 【超详细,全流程】java对接支付宝支付
    支付流程 一、对接前的准备1.1创建应用,获取参数:APPID(使用沙箱环境可跳过)1.1.1添加产品1.1.2配置密钥,获取第二个参数:商户的私钥1.1.3支付宝网关1.1.4生成参数密钥对...
    99+
    2023-10-21
    java
  • Android App支付系列(一):微信支付接入详细指南(附官方支付demo)
    写在前面 一家移动互联网公司,说到底,要盈利总是需要付费用户的,自己开发支付系统显然是不明智的,国内已经有多家成熟的移动支付提供商,腾讯就是其中之一。梳理了下微信支付的接入,今...
    99+
    2022-06-06
    demo 微信支付 app Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作