微信公众号实现微信支付(含前后端完整代码)

2023-11-19

刚做完公众号微信支付,记录一下。获取微信支付之前,要先获取用户的基本信息哦!

前端使用uniapp开发的H5,小伙伴们可以照着改一下对应语法
首先来个微信支付的工具类 wxApi.js,这里我放到了项目下的common目录下,代码如下:

/*
    微信(公众号)支付方法
*/
const wx = require('jweixin-module');
const wexinPay = (data, callback, errorCallback) => {
	let [appId, timestamp, nonceStr, signature, packages, sign] = [data.appId, data.timeStamp, data.nonceStr, data
		.sign,
		data.package, data.sign
	];

	wx.config({
		debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
		appId, // 必填,公众号的唯一标识
		timestamp, // 必填,生成签名的时间戳
		nonceStr, // 必填,生成签名的随机串
		signature, // 必填,签名,见附录1
		jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
	});
	WeixinJSBridge.invoke(
		'getBrandWCPayRequest', {
			appId: appId, //公众号名称,由商户传入
			timeStamp: timestamp, //时间戳,自1970年以来的秒数
			nonceStr: nonceStr, //随机串
			package: data.package,
			signType: data.signType, //微信签名方式:
			paySign: sign //微信签名
		},
		function(res) {
			if (res.err_msg == 'get_brand_wcpay_request:ok') {
				// 使用以上方式判断前端返回,微信团队郑重提示:
				//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
				//支付成功回调
				callback(res)
				
				/* if (res.err_msg == 'get_brand_wcpay_request:cancel') */
			} else{
				//支付失败回调
				errorCallback(res)
			}
		}
	)
}

export default {
	wexinPay
}

然后在页面中调用这个工具类就可以了,调用代码如下:

this.$wxPay(payInfo, function(res) {
								uni.setStorageSync('type', '1')
								uni.showToast({
									title: '支付成功!',
									duration: 3000
								})
								uni.reLaunch({
									url: './xxx'
								})
							}, function(e) {
								uni.showToast({
									title: '支付失败!',
									duration: 3000
								})
							})

我跳转到了另一个页面,在另一个页面判断type是否等于1,等于1时,修改对应用户表和订单日志表

后端接口代码如下:
String appID = xxx;
String mchID =xxx; //商户号
String appSecret = xxx;
String key = “xxx”;

@Autowired
private PayLogService payLogService;
@PostMapping("/xxx")
public CommonResult wxjspay(HttpServletRequest request,PayLog payLog,@RequestParam(value="openid",required = false)String openid,@RequestParam(value="uid",required = false)String uid) throws Exception {

    //创建sdk客户端
    WXPay wxPay = new WXPay(new WXPayConfigCustom());
    //构造请求的参数
    Map<String,String> requestParam = new HashMap<>();

    //生成订单号 时间戳+用户id+6位随机数
    Integer ranNum = Math.toIntExact(Math.round((Math.random() + 1) * 1000));
    String tradeNo = System.currentTimeMillis()/1000+uid+ranNum;
    System.out.println("订单号==="+tradeNo);

    requestParam.put("out_trade_no",tradeNo);//订单号
    requestParam.put("body", "vip");//订单描述
    requestParam.put("fee_type", "CNY");//人民币
    requestParam.put("total_fee", String.valueOf(payLog.getPrice())); //金额
    requestParam.put("spbill_create_ip", IPUtils.getIpAddr(request));//客户端ip
    requestParam.put("notify_url", "none");//微信异步通知支付结果接口,暂时不用
    requestParam.put("trade_type", "JSAPI");

    log.info("ip地址==="+requestParam.get("spbill_create_ip"));

    requestParam.put("openid",openid);
    //调用统一下单接口
    Map<String, String> resp = wxPay.unifiedOrder(requestParam);

    Map resultMap = new HashMap();
    System.out.println("resp===="+resp.toString());
    System.out.println("resp.get(\"result_code\"====)"+resp.get("result_code"));
    if(resp.get("result_code").equals("SUCCESS")){
        System.out.println("同意下单接口==="+resp.toString());

        //准备h5网页需要的数据
        Map<String,String> jsapiPayParam = new HashMap<>();
        jsapiPayParam.put("appId",appID);
        jsapiPayParam.put("timeStamp",System.currentTimeMillis()/1000+"");
        jsapiPayParam.put("nonceStr", UUID.randomUUID().toString());//随机字符串
        jsapiPayParam.put("package","prepay_id="+resp.get("prepay_id"));
        jsapiPayParam.put("signType","HMAC-SHA256");
        jsapiPayParam.put("sign", WXPayUtil.generateSignature(jsapiPayParam,key, WXPayConstants.SignType.HMACSHA256));
        //将h5网页响应给前端
        System.out.println("111==="+jsapiPayParam.toString());

        //将数据添加到支付表
        payLog.setPubopenId(openid);
        payLog.setTransaction_id(tradeNo);
        payLog.setTotal_fee(240000);
        payLog.setResult_status(1);
        payLog.setResult_code(resp.get("result_code"));
        payLog.setReturn_code(resp.get("return_code"));
        payLog.setReturn_data(resp.get("return_data"));
        payLogService.addPayLog(payLog);

        resultMap.put("tradeNo",tradeNo);
        resultMap.put("jsapiPayParam",jsapiPayParam);

        return new CommonResult(200,"查询成功",resultMap);
    }else{
        return new CommonResult(100500,resp.get("err_code_des"));
    }
}
class  WXPayConfigCustom extends WXPayConfig {

    @Override
    protected String getAppID() {
        return appID;
    }

    @Override
    protected String getMchID() {
        return mchID;
    }

    @Override
    protected String getKey() {
        return key;
    }

    @Override
    protected InputStream getCertStream() {
        return null;
    }

    @Override
    protected IWXPayDomain getWXPayDomain() {
        return new IWXPayDomain() {
            @Override
            public void report(String s, long l, Exception e) {

            }

            @Override
            public DomainInfo getDomain(WXPayConfig wxPayConfig) {
                return new DomainInfo(WXPayConstants.DOMAIN_API,true);
            }
        };
    }
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信公众号实现微信支付(含前后端完整代码) 的相关文章

  • 分布式系统---幂等性设计

    分布式系统 幂等性设计 WEB资源或API方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用 幂等性是系统的接口对外一种承诺 而不是实现 承诺只要调用接口成功 外部多次调用对系统的影响是一致的 幂等性是分布式系统设计中的一个重要概

随机推荐

  • 操作系统笔记六(文件管理)

    1 文件逻辑结构 1 1逻辑结构的文件类型 分类 有结构文件 例如 PNG文件 无结构文件 1 2顺序文件 1 3索引文件 2 辅存的存储空间分配 2 1分配方式 连续分配 直接分配连续的存储空间 链接分配 隐式链接 在盘块内指定下一个盘块
  • 《华为机试》刷题之HJ88 扑克牌大小

    一 题目 二 示例 三 代码 dic 3 1 4 2 5 3 6 4 7 5 8 6 9 7 10 8 J 9 Q 10 K 11 A 12 2 13 joker 14 JOKER 15 while True try s1 s2 input
  • taking address of temporary错误

    前些天将一个项目从VS2013移植到Qt上 遇到了这样一个问题 Dispatch gt XCDispatchMessage linev error taking address of temporary这段代码从VS2013通过了编译 但是
  • 第十三章 公告板与粒子系统 标签: ogre公告板粒子系统ogre粒子系统

    Ogre编程入门与进阶 第十三章 公告板与粒子系统 标签 ogre公告板粒子系统ogre粒子系统 2015 07 05 14 41 1365人阅读 评论 1 收藏 举报 分类 Orge模块 16 版权声明 本文为博主原创文章 未经博主允许不
  • macbook百度网盘下载保存的文件在哪❓找不到

    困扰我好久的问题终于被我解决了 之前在AppStore里下载百度网盘 然后在百度网盘里下载文件 除了能直接打开以后 怎么都找不到文件位置 后来我终于知道了 是因为在AppStore里下载的百度网盘根本不是mac版的 如果你想下载mac版的百
  • 安卓TabLayout的使用

    安卓TabLayout的使用 我们在进行安卓开发时 常常会使用到ViewPager 为了展示更美观的效果 我们经常会选择第三方的诸如TabPageIndicator等配合ViewPager使用 但是TabPageIndicator已经很老了
  • 简单地使用webpack进行打包

    下面的webpack是4 14 0版本的 当时我学的 更新太快了 现在5 10 0了 你学习的时候 用的是最新的 就不要往下看啦 官方文档已经更新教程了 这是我看5 10 0教程后 简单搭建的打包demo 可以参考 或者你也自己去官网看文档
  • SpringCloud-Alibaba Nacos

    Nacos 简介 为什么叫Nacos 前四个字母分别为Naming和Configuration的前两个字母 最后的s为Service 是什么 一个更易于构建云原生应用的动态服务发现 配置管理和服务管理平台 Nacos Dynamic Nam
  • STM32的串口中断详解

    目录 中断配置 中断服务函数 1 中断服务函数名称查找 2 中断服务函数 3 可以选择的串口中断类型 extern u8 USART RX BUF USART REC LEN extern u16 USART RX STA 中断配置 使能接
  • js 字符串拼接的4种方法

    一 使用连接符 把想要连接的字符串串起来 let shy 帅哥 let a 我是 shy console log a 我是帅哥 二 模板字符串 模板字符串 template string 是增强版的字符串 用反引号 标识 特点 1 字符串中
  • 20221129-1Spring_day03(资料来自黑马程序)

    Spring day03 今日目标 理解并掌握AOP相关概念 能够说出AOP的工作流程 能运用AOP相关知识完成对应的案例编写 重点掌握Spring的声明式事务管理 1 AOP简介 前面我们在介绍Spring的时候说过 Spring有两个核
  • 【HTML】修复选中项与实际后台控制的选中项不一致的问题

    项目场景 项目场景 系统项目中有一个需要通过后台传递选中项的下拉项 由于反复确认都无法主动更新 考虑到其他人推荐的 方法 也是没有效果的 例如 无效
  • 首个数字银行卡明年发行,广州出台区块链措施支持大湾区

    锌链接作为首个提出产业区块链的机构媒体 一直积极推动产业区块链落地 通过深度报道直戳行业痛点 通过分享会聆听行业声音 通过周报呈现行业大观 通过评论展现独特产业观察视角 本周 广州出台66条措施支持粤港澳大湾区金融发展 其中多项与区块链有关
  • CVPR 2023和ICLR 2023异常检测相关文章

    关键词 Anomaly Detection Outlier Detection Out of Distribution Abnomal Detecting Abnormal Detection Defect DetectionInspect
  • 两万字整理Fabric(超级账本) 配置文件 掌握了它就掌握了Fabric的核心

    导语 文章没有重复的地方 没有废话 如果能帮助到你 那是我的荣幸 记得一键三连哟 Fabric 配置文件详解 一 四个核心配置文件 二 Fabric 的核心配置文件 三 网络启动步骤 1 生成认证证书 crypto config yaml
  • JS 时区时间转换

    业务场景 页面服务器时间是东八区时间 页面 JS 功能需要对比服务器时间和用户本地时间 为兼容世界各地时间 需要将用户本地时间转换为东八区时间 基本概念 格林威治时间 格林威治子午线上的地方时 或零时区 中时区 的区时叫做格林威治时间 也叫
  • cocos2d-x 之 适配分辨率全屏的方法

    原文出处 https blog csdn net yixiao3660 article details 54316348https www jianshu com p 0d6787e31112 http dualface github io
  • 从架构师的角度看服务器端架构点滴

    任何服务器端的架构设计 都是性能 一致性和成本三者的权衡 从我在目前的大规模互联网视频公司的负责APP服务器端的角度来讲 我主要关注以下几个点 业务 可靠性 性能 可维护性 一 业务 框架上保证业务的快速迭代 在性能要求不高的情况下 同步架
  • ubuntu 安装 python3.9

    一 相关背景 之前在dockerfile里面一直使用的是python3 8 忘记为什么选择这个版本了 想用python3 9 因为觉得3 8有点老了 而且3 9一个重要的feature 是把list作为默认的类型 不需要从typing 里面
  • 微信公众号实现微信支付(含前后端完整代码)

    刚做完公众号微信支付 记录一下 获取微信支付之前 要先获取用户的基本信息哦 前端使用uniapp开发的H5 小伙伴们可以照着改一下对应语法 首先来个微信支付的工具类 wxApi js 这里我放到了项目下的common目录下 代码如下 微信