微信支付接口

微信支付(JSAPI支付)接入流程 JSAPI支付是指商户通过调用微信支付提供的JSAPI接口,在支付场景中调起微信支付模块完成收款。 阅读详情

pom.xml

		<!--wxPay-->
		<dependency>
			<groupId>com.github.wxpay</groupId>
			<artifactId>wxpay-sdk</artifactId>
			<version>0.0.3</version>
		</dependency>

aoolication.yml

pay:
  wxpay:
    gzhId: ***
    appId: ***
    mchID: ***
    appSecret: ***
    paternerKEY: ***
  port: 8899

RestPayController.java

package com.ruoyi.api.wechat;

import com.github.wxpay.sdk.WXPayUtil;
import com.google.common.collect.Maps;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.framework.web.controller.BaseController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

/**
 * @author wangjiao
 * @version 1.0
 * @date 2020/4/21
 */
@Api(tags = "微信支付相关接口")
@RestController
@RequestMapping("/rest/pay")
@Slf4j
public class RestPayController extends BaseController {

    @Value("${pay.wxpay.appId}")
    public String APPID;    //平台ID
    @Value("${pay.wxpay.appSecret}")
    public String APPSECRET;   //平台密钥
    @Value("${pay.wxpay.mchID}")
    public String MCHID;   //商家ID
    @Value("${pay.wxpay.paternerKEY}")
    public String PATERNERKEY; //商家密钥

    /**
     * 微信浏览器内微信支付/公众号支付(JSAPI)
     * @param openId
     * @param money
     * @param request
     * @param response
     * @return
     */
    @ApiOperation(value = "微信支付订单", notes = "所有参数必填")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "orderNumber", value = "订单编号"),
            @ApiImplicitParam(name = "openId", value = "微信openId"),
            @ApiImplicitParam(name = "money", value = "订单金额")
    })
    @GetMapping("/orders")
    @ResponseBody
    public Map<String, String> orders(String orderNumber,String openId, String money, HttpServletRequest request, HttpServletResponse response) {
        if (StringUtils.isBlank(orderNumber)||Objects.isNull(openId)|| StringUtils.isBlank(money)) {
            Map<String, String> errorMap = Maps.newHashMap();
            errorMap.put("301","必填参数为空");
            return errorMap;
        }
        try {
            log.info("进入支付接口了");
            log.info("openId==" + openId + "====money==" + money);

            // 拼接统一下单地址参数
            Map<String, String> paraMap = new HashMap<String, String>();
            // 获取请求ip地址
            String ip = request.getHeader("x-forwarded-for");
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
            }
            if (ip.indexOf(",") != -1) {
                String[] ips = ip.split(",");
                ip = ips[0].trim();
            }

            paraMap.put("appid", APPID); // 商家平台ID
            paraMap.put("body", "纯情小店铺-薯条"); // 商家名称-销售商品类目、String(128)
            paraMap.put("mch_id", MCHID); // 商户ID
            paraMap.put("nonce_str", WXPayUtil.generateNonceStr()); // UUID
            paraMap.put("openid", openId);
            paraMap.put("out_trade_no",UUID.randomUUID().toString().replaceAll("-", ""));//orderNumber 订单号,每次都不同
            paraMap.put("spbill_create_ip", ip);
            paraMap.put("total_fee", money); // 支付金额,单位分
            paraMap.put("trade_type", "JSAPI"); // 支付类型
            //用户支付完成后,你想微信调你的哪个接口
            paraMap.put("notify_url", "用户支付完成后,你想微信调你的哪个接口");// 此路径是微信服务器调用支付结果通知路径随意写
            String sign = WXPayUtil.generateSignature(paraMap, PATERNERKEY);
            paraMap.put("sign", sign);
            String xml = WXPayUtil.mapToXml(paraMap);// 将所有参数(map)转xml格式

            // 统一下单 https://api.mch.weixin.qq.com/pay/unifiedorder
            String unifiedorder_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";

            System.out.println("xml为:" + xml);

            // String xmlStr = HttpRequest.sendPost(unifiedorder_url,
            // xml);//发送post请求"统一下单接口"返回预支付id:prepay_id

            String xmlStr = HttpUtils.httpsRequest(unifiedorder_url, "POST", xml);

            System.out.println("xmlStr为:" + xmlStr);

            // 以下内容是返回前端页面的json数据
            String prepay_id = "";// 预支付id
            if (xmlStr.indexOf("SUCCESS") != -1) {
                Map<String, String> map = WXPayUtil.xmlToMap(xmlStr);
                prepay_id = (String) map.get("prepay_id");
            }

            Map<String, String> payMap = new HashMap<String, String>();
            payMap.put("appId", APPID);
            payMap.put("timeStamp", new Timestamp(System.currentTimeMillis()) + "");
            payMap.put("nonceStr", WXPayUtil.generateNonceStr());
            payMap.put("signType", "MD5");
            payMap.put("package", "prepay_id=" + prepay_id);
            String paySign = WXPayUtil.generateSignature(payMap, PATERNERKEY);
            payMap.put("paySign", paySign);
            //将这个6个参数传给前端
            return payMap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * @Title: callBack
     * @Description: 支付完成的回调函数
     * @param:
     * @return:
     */
    @RequestMapping("/notify")
    public String callBack(HttpServletRequest request, HttpServletResponse response) {
        // System.out.println("微信支付成功,微信发送的callback信息,请注意修改订单信息");
        InputStream is = null;
        try {

            is = request.getInputStream();// 获取请求的流信息(这里是微信发的xml格式所有只能使用流来读)
            String xml = InputStream2String(is);
            Map<String, String> notifyMap = WXPayUtil.xmlToMap(xml);// 将微信发的xml转map

            System.out.println("微信返回给回调函数的信息为:" + xml);

            if (notifyMap.get("result_code").equals("SUCCESS")) {
                String ordersSn = notifyMap.get("out_trade_no");// 商户订单号
                String amountpaid = notifyMap.get("total_fee");// 实际支付的订单金额:单位 分
                BigDecimal amountPay = (new BigDecimal(amountpaid).divide(new BigDecimal("100"))).setScale(2);// 将分转换成元-实际支付金额:元

                /*
                 * 以下是自己的业务处理------仅做参考 更新order对应字段/已支付金额/状态码
                 */
                System.out.println("===notify===回调方法已经被调!!!");

            }

            // 告诉微信服务器收到信息了,不要在调用回调action了========这里很重要回复微信服务器信息用流发送一个xml即可
            response.getWriter().write("<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return null;
    }

    public static String InputStream2String(InputStream is) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        byte[] buffer = new byte[1024];
        int len = -1;
        while ((len = is.read(buffer)) != -1) {
            baos.write(buffer, 0, len);
        }
        baos.close();
        is.close();

        byte[] lens = baos.toByteArray();
        String result = new String(lens, "UTF-8");//内容乱码处理

        return result;

    }
}

微信支付接口详细步骤 对接微信支付接口-详细步骤教程-你不知道的那些坑@TOC 近期公司项目需要对接微信支付宝等支付接口,然后就看官网看文档查百度,我这里只说对接微信支付接口,下一篇说微信退款. 先登录微信官网查看文档 这里我先解释一下微信支付接口的步骤 第一步:统一下单 (此操作是我们对接微信接口,微信接口需要生成订单的操作所以这里是第一步) 第二步:调起支付接口 (此操作是第一步调用微信然后返回参数 针对这些参数返还给ios或者安卓等 他们调起对应app的支付接口 ) 第三步:支付结果通知 (这一步是支付完成之 阅读详情

相关推荐

Java调用微信支付接口

一、场景:公司需要在网站上进行微信支付。 二、API:使用微信开放平台的接入微信支付  -扫码支付。微信支付开发者平台链接 三、分析: 接入扫码支付(包含PC网站支付)包含三个阶段,问这里只讲使用,也就是第2阶段的《启动设计和开发》。点击查看开发者文档(扫码支付)后,这里感觉微信的文档没有支付宝好理解(稍微吐槽下~~~),不过我们忽略一切,直接进入模式二

Teacher_Lee_ZZSXT的博客 1万+

一键获取网站源码_分享价值7000开运网付费测算源码开源搭建带详细配置教程供研究...

请输入图片描述请输入图片描述请输入图片描述开运网测算源码安装说明文档务必看详细、务必看详细、务必看详细linux系统请安装宝塔,配备Nginx。下面的介绍也是根据此环境下,宝塔安装的。win系统兼容性未做测试。付费测算需要一个指向付费测算ffsm一个作为后台指向根目录免费版需要解析两个域名,一个pc一个移动端,分别指向根目录和m文件夹(没购买免费版请忽略)后台地址:http://指向根目录的域名/...

weixin_39716800的博客 1258

微信支付》统一下单接口调用

遇到第一次做微信支付的小伙伴可能会遇到很大的问题,第一感觉就是摸不着头脑,完全没思路 我先给你说一下微信支付的流程,当你看过微信的官方文档之后,需要的一些关键参数我想你已经了解了,主要是appid,mch_id,key为商户平台设置的密钥key。这些参数可是必不可少的哟。支付流程分以下几步: 1)获取用户openID(如果你无法获取,建议你先去看看怎么获取openID) 2)通过统一下单接口创

ekjheidj的专栏 1765

java对接微信支付SDK接口

在微信公众平台https://mp.weixin.qq.com/ 注册应用,类型只选择“公众号/小程序/企业微信”,注册完成后需完成”微信认证“(微信收取300元),在基础配置中拿到开发者ID(微信支付 APIv3 使用由 证书授权机构(Certificate Authority,简称CA)签发的证书,商户申请证书时,证书工具会生成。在微信支付商户平台https://pay.weixin.qq.com注册商户,在账户中心-api安全中设置。在账户中心-商户信息中拿到微信支付。-- 微信支付SDK -->

u013534849的专栏 6750

微信支付接口调用实战教程

被扫支付业务逻辑是商户通过展示二维码或条形码,由消费者使用微信“扫一扫”功能进行支付的方式。该模式适用于线下消费场景,如零售店、餐饮业等,用户无需输入任何支付信息,操作简便快捷。在被扫支付模式中,商户端需要生成一个支付二维码,包含支付信息和商户标识。消费者使用微信扫描该二维码后,微信客户端将解析出支付信息,并向微信支付服务器发起支付请求。服务器验证信息无误后,扣除消费者账户中的相应金额,并通过异步通知的方式将支付结果反馈给商户系统。

weixin_42437253的博客 1751

FPGA新手必看:Create HDL Wrapper和Generating Output Products到底该先用哪个?

本文深入解析了FPGA设计中Create HDL Wrapper与Generating Output Products的正确使用顺序,帮助新手避免常见错误。详细介绍了两者的功能差异、执行顺序的底层逻辑以及工程管理的最佳实践,特别适合使用Vivado进行FPGA开发的初学者。

xk7n92h3p5m的博客 1064

西米支付:微信支付接口(申请与介绍)

据统计,2022年微信全球用户数超12.8亿,其中微信支付使用人数达到6亿,而且微信支付在中国移动支付的市场份额超过40%,无论是在线上购物,还是线下收款,都能看到微信支付的身影,微信支付已经融入到我们的日常生活中。所以,商家在接入支付接口的时候,不得不考虑微信支付接口申请和接入,以此来满足用户的付款需求。是指其他大中型第三方支付公司(如,杉德支付、首信易支付、杭州商盟、汇潮支付等)与财付通签订《合作协议》,以较低的费率成本,获得微信支付通道的使用权,为商户提供包含微信支付在内的多种支付产品。

JYeon_2的博客 5014

在 dell precision 7920 tower CentOS 8 Stream 上安裝nvidia驱动程序、Anaconda

简单记录一下如何在实验室dell precision 7920 tower CentOS 8 Stream上安装nvidia显卡驱动。

chen9046的博客 994

对接微信支付接口

springboot中对接微信支付接口

southwind1的博客 5296

Alipay 支付唤起 h5 测试

测试地址 https://recharge.apps.oppomobile.com/recharge-center/recharge/?from=message try { //唤起客户端快捷参数 var data = {"requestType":"SafePay","fromAppUrlScheme":"alipays","dataString":"h5_ro...

六桥风月IT随笔 1万+

ADS高级技巧:用DAC控件实现多变量参数扫描(以S参数和阻抗匹配为例)

本文深入解析了ADS软件中DAC控件的高级应用,指导用户如何利用其实现多变量参数扫描。通过构建支持多变量的MDF文件,并将其与原理图变量动态映射,可以高效完成如S参数和阻抗匹配等复杂场景的联合仿真与可视化分析,显著提升射频电路设计的效率和深度。

3a9bq4r8t2y的博客 253

微信支付接口,错误提示大全

支付返回签名错误 注意签名参数的大小写,支付密钥key要到商户平台设置,设置的规则是32位数字与字母大小写的组合。以下链接为签名过程。(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=3_1)     支付回调 认证后的服务号之间支持跨号支付。   支付失败 请检查商户号是否错误或...

BigChicken3的博客 5502

零基础基于U-Net网络实战眼底图像血管提取

文章目录1 前言2 血管提取任务概述3 U-Net架构简介4 眼底图像血管分割代码5 结果评估可视化(ROC曲线)6 改进U-Net网络完成眼底图像血管提取任务思路 1 前言 本文基于U-Net架构完成了视网膜血管的提取任务,基于Keras框架更简单的实现分割,网络、工具类、训练和预测的代码一目了然

NJU phd 在读。 5200

微信支付接口的调用

在上周的博客中我讲了调用支付宝的接口实现支付,这周我们继续来讲一讲如何调用微信的支付接口。 在讲之前依然先给出微信的官方接口说明。官方的场景介绍图如下: 其实pc端的支付场景都差不多,用户点击按钮,生成一个二维码,微信扫码之后支付成功。要调用微信的接口,首先你需要引入微信支付的jar包,如下: &lt;dependency&gt; &lt;gr...

zoroduyu的博客 5万+

YOLO与ORB-SLAM3的结合:实现动态环境下的目标检测与视觉SLAM

摘要: 本文介绍如何将YOLOv5目标检测与ORB-SLAM3视觉SLAM系统结合,实现动态环境下的机器人感知与定位。内容包括:源码下载(集成项目YOLO_ORB_SLAM3)、libtorch安装(PyTorch C++支持)、编译配置(解决路径依赖问题)、ROS环境下的部署(Noetic适配),以及使用TUM数据集的测试流程(RGB-D数据关联与运行)。重点解决编译时Torch路径错误、ROS与Anaconda冲突等问题,并展示系统运行效果。该整合方案为动态场景SLAM提供目标检测能力,未来可优化检测模

FJN110的博客 960

使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统

智能家居多传感器数据融合系统旨在通过集成来自多种不同类型的传感器的数据,以提供更精确和可靠的环境信息或用户状态监测。例如,将温度、湿度、光照强度、运动检测等多种传感器的数据结合起来,可以更好地了解家庭内部的状态,并做出相应的调整或响应。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统。

amy_mhd的博客 187

java开发微信支付接口_JAVA微信支付接口开发——支付

微信支付接口开发——支付这几天在做支付服务,系统接入了支付宝、微信、银联三方支付接口。个人感觉支付宝的接口开发较为简单,并且易于测试。关于数据传输,微信是用xml,所以需要对xml进行解析。1、微信支付的几种接口付款码支付、JSAPI支付、Native支付、APP支付、H5支付、小程序支付。几种支付方式都是大同小异。2、支付流程基于APP支付来说,微信支付的大体流程:1、APP客户端根据用户支付请...

weixin_39779032的博客 1267

ASProxy64.dll导致jetbrains家的IDE都无法打开。

摘要:在Windows11系统中,JetBrains IDE无法启动,报错指向ASProxy64.dll文件。该第三方DLL被注入到JVM原生层,导致内存访问冲突(错误代码0xc0000005)。经排查发现此文件来自Astrill软件。解决方案为卸载Astrill后重启电脑,问题得以解决。该案例表明第三方DLL注入可能影响IDE正常运行,卸载相关软件是最直接的解决方法。(149字)

猿小白的博客 936

调用微信支付接口总结

调用微信支付接口总结 时间:2018-04-09 23:17:29 阅读:2020 评论:0 收藏:0[点我收藏+] 标签:工具发送tps认证跳转设计查询val代码   毕业设计项目里面用到了微信支付的功能,在视频教程里面学习了一下,这里做个总结来记录。教材的模板里面用到的是anglusJS来做前端开发,我这边简化了,用的ajax进行异步的调用,然后业务也直接写在了控制层(不过不应该这么写的。。),应该是个...

yj_xy的博客 1389

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【微信支付】统一下单接口详解

微信支付的统一下单接口主要用于生成预支付交易单。商户系统向微信支付服务发起统一下单请求。微信支付后台根据请求生成预支付交易单,并返回prepay_id。商户使用prepay_id调起支付,完成支付流程。

lph159的博客 3242

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PHP开发APP微信支付接口

PHP开发APP微信支付接口 转载 : 这段时间在给一个iOS应用程序开发一个微信支付接口,之前并没有接触过微信支付,翻阅了一上午的微信开发文档,对其流程做了大致的了解后,便开始着手该接口程序的编写。 编写的过程中也遇到了各种各样的问题,各方查找资料,终于完成了该接口的开发。想到以后小伙伴们肯能会用的到,因此,我将整个接口的开发流程分享给大家。 【准备工作】 在准备着手开发之前呢...

BlueSky 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

微信支付接口 退款接口

相比支付宝的接口,微信的接口与实现都很简单其实,官方文档都有很详细的讲解。 <?php namespace app\api\controller; use think\Controller; use think\Request; use think\Db; use org\lib\Wechatapppay; class Wechatpay extends Controller { /

小井的博客 1万+

微信支付接口与回调接口

【代码】微信支付接口与回调接口。

weixin_42759398的博客 798

APP微信支付接口

微信APP支付接口分享、贴上代码就能用

Smile_Ren的专栏 3939
上一篇: 微信登录接口
下一篇: 短信登录接口-web
夕颜以北
博客等级 码龄9年 30粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值