本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解。小程序支付主要
包含如下几步骤,1.预下单-调用微信统一下单接口进行预下单。2.小程序拿到支付参数唤醒支付。3.支付成功后发起退
款申请。

本文使用okHttpUtil进行接口交互 使用goole的gson与阿里的fastJson进行解析JsonObect,使用封装的http工具类进行携
带证书进行接口交互、使用封装的工具类实现map转xml等。

下面是正文:

微信支付文档:  https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1

一.获取微信用户的openId:
    用户登录小程序 通过授权得到微信code,然后将微信code、秘钥、密文传递后端,后端进行解密后 得到微信openId
(前端也可以进行解密,但建议放后端)下面是获取openId的代码(java)

//获取微信openId接口url
https://api.weixin.qq.com/sns/jscode2session
/*** 解析小程序登录数据获取参数* @param code  ---微信code* @param encryptedData --- 加密参数* @param iv --- 秘钥* @return*/
public Result<?> getAuthByApplet(String code, String encryptedData,String iv) {Map<String, Object> resultMap = new HashMap<>();try {log.debug("=========小程序获取unionId=============: "+ code);//封装参数Map<String, String> params = new HashMap<String, String>();//获取小程序的openIdparams.put("appid", appletId);//微信秘钥params.put("secret", appletSecret);params.put("js_code", code);params.put("grant_type", "authorization_code");//调用接口进行读取参数JsonObject retJson =  OkHttpUtils.doGetRetJson(appletOpenIdUrl, params);log.debug(retJson.toString());//如果获取到了openIdif(retJson.get("openid") != null) {//获取会话密钥(session_key)String session_key = retJson.get("session_key").getAsString();resultMap.put("session_key", session_key);resultMap.put("openId", retJson.get("openid").getAsString());}else{throw new Exception("code已失效,请重新获取");}return Result.ok(resultMap);} catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException();}
}

得到openId后要进行业务保存,因为小程序很多接口都依赖openId,而且同一小程序下,每个微信号的openId是一样
的。

二:统一下单与小程序支付
        通过业务系统的封装参数,得到支付的商品信息,价格,业务订单后,封装参数,进行加密得到sign签名,然后
调用统一下单接口进行下单,成功后返回小程序支付参数。
(需要注意的是 微信预下单请求参数要求是xml格式,全String类型)

//微信预下单接口url
https://api.mch.weixin.qq.com/pay/unifiedorder
/*** 微信支付-统一下单* @param body --- 商品描述* @param outTradeNo --- 业务系统订单号* @param totalFee --- 支付金额* @param spBillCreateIP ---支付人所在* @param openId --- 支付人的微信openId* @return*/@Overridepublic Map<String, String> toPay(String body,  String outTradeNo,String totalFee, String spBillCreateIP, String openId) {try{Map<String, String> map = new HashMap<>();//封装支付必须参数SortedMap<Object,Object> params = new TreeMap<Object,Object>();//支付类型      String tradeType = "JSAPI";//支付后回调地址String notifyUrl = "";String nonceStr = RandomUtil.randomString(16);//小程序idparams.put("appid", appletId);//商户平台idparams.put("mch_id", mchId);//随机字符串params.put("nonce_str", nonceStr);//商品描述params.put("body", body);//商品订单号params.put("out_trade_no", outTradeNo);//价格的单位为分params.put("total_fee", totalFee);//支付ipparams.put("spbill_create_ip", spBillCreateIP);//异步回调apiparams.put("notify_url", notifyUrl);//JSAPI、h5调用params.put("trade_type", tradeType);//支付用户openidparams.put("openid", openId);String sign = WxPaySignatureUtils.createSign(params, key);params.put("sign", sign);String requestXML = WxPaySignatureUtils.getRequestXml(params);log.info("发送给微信的报文:" + requestXML);log.info("加密后的的签名字符串:" + sign);//调用微信接口String result = OkHttpUtils.postXml(unifiedorder, requestXML);log.info("-------------------请求返回结果------------------");log.info(result);map = WXPayUtil.xmlToMap(result);//如果返回有数据if(map != null){//并且返回有signif(map.get("sign") != null){return map;}}return map;}catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException();}}

接口请求成功后,微信返回也是xml格式的报文,需要将xml转为map或其他,本文使用map接收参数,预下单后,
微信会返回预付订单标识,标识用于进支付。

//预付订单标识
String prepayId = resultMap.get("prepay_id");

然后封装小程序支付 所需参数

//签名类型,默认为MD5
String signType = "MD5";
SortedMap<Object,Object> params = new TreeMap<Object,Object>();
params.put("appId", appletId);
params.put("timeStamp", timestamp + "");
params.put("timeStamp", timestamp + "");
params.put("nonceStr", nonceStr);
params.put("package", "prepay_id=" + prepayId);
params.put("signType", signType);
//生成签名
String sign = WxPaySignatureUtils.createSign(params, key);
params.put("paySign", sign);

将支付参数返回给小程序,小程序通过组件 requestPayment 唤醒支付
小程序支付代码如下:

wx.requestPayment({timeStamp:param.result.timeStamp,nonceStr: param.result.nonceStr,package: param.result.package,signType:param.result.signType,paySign: param.result.paySign,success: function(res){console.log(res);wx.showToast({title: '支付成功',icon: 'success',duration: 2000});          },fail: function(res) {wx.showModal({title:'支付失败',content:'<text>',showCancel: false})}})

三: 退款
    小程序支付成功后,可以通过支付订单号进行退款操作,需要注意的是,退款需要http携带商户证书进行支
付,这里图图已经封装好工具类只需要修改下证书的url就可以愉快使用了。

//微信退款使用的url
https://api.mch.weixin.qq.com/secapi/pay/refund
/*** 微信支付-退款* @param transaction_id   ---微信支付订单* @param out_refund_no --- 系统退款单号* @param total_fee  --- 订单总金额* @param refund_fee  --- 退款金额* @return*/@Overridepublic Map<String, String> refundToPay(String transaction_id, String out_refund_no, String out_trade_no, int total_fee, int refund_fee) {//定义返回参数Map<String, String> map = new HashMap<>();try{SortedMap<Object,Object> params = new TreeMap<Object,Object>();String notifyUrl = "https://baidu.com";String nonceStr = RandomUtil.randomString(16);//小程序idparams.put("appid", appletId);//商户平台idparams.put("mch_id", mchId);//随机字符串params.put("nonce_str", nonceStr);//系统订单号params.put("out_trade_no", out_trade_no);//微信订单号params.put("transaction_id", transaction_id);//系统退款单号params.put("out_refund_no", out_refund_no);//订单金额params.put("total_fee", total_fee);//退款金额params.put("refund_fee", refund_fee);//签名String sign = WxPaySignatureUtils.createSign(params, key);params.put("sign", sign);//封装请求报文String requestXML = WxPaySignatureUtils.getRequestXml(params);log.info("发送给微信的报文:" + requestXML);log.info("加密后的的签名字符串:" + sign);//调用微信接口String result = WXPayUtil.doRefundRequest(mchId, refund, requestXML, certificateUrl);log.info("-------------------请求返回结果------------------");log.info(result);if(StrUtil.isNotEmpty(result)){map = WXPayUtil.xmlToMap(result);//如果返回有数据if(map != null){//并且返回有signif(map.get("sign") != null){return map;}}}else{log.info("-------------------请求返回空结果------------------");}return map;}catch (Exception e) {log.error(e.getMessage(), e);throw new RuntimeException();}}

本文中所使用到的工具类,图图已经帮大家打包好了,在百度网盘。

百度网盘下载链接

链接:https://pan.baidu.com/s/1YbMrvO3qK1rdmyYyET2xzw

提取码:ljv6

本文先总结到此,后面继续更新技术一些文章。大家一起加油鸭!

SpringBoot实现微信小程序支付相关推荐

  1. SpringBoot对接微信小程序支付功能开发(一,下单功能)

    1,接入前准备: 接入模式选择直连模式: 申请小程序,得到APPID,并开通微信支付: 申请微信商户号,得到mchid,并绑定APPID: 配置商户API key,下载并配置商户证书,根据微信官方文档 ...

  2. SpringBoot对接微信小程序支付功能开发(二,支付回调功能)

    接着上一篇: SpringBoot对接微信小程序支付功能开发(一,下单功能) 在上一篇下单功能中我们有传支付结果回调地址. 下面是回调接口实现 package com.office.miniapp.c ...

  3. SpringBoot 搭建微信小程序支付(JSAPI) 纯后端

    一.支付流程 PS:做这个之前  ,先去下载官方的SDK吧  https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 1.首先要拿到 ...

  4. 微信小程序支付以及退款功能(超详细)

    Springboot整合微信小程序支付 第一步: 第二步:导入微信支付的依赖 第三步:在springboot核心配置文件中配置参数 第四步:创建配置类WxPayAppConfig 第五步:支付方法 s ...

  5. 基于springboot微信小程序支付功能实现

    基于springboot微信小程序支付功能实现 简单的封装微信小程序支付功能,支付工具类所依赖的fastjson.lombok.wagegger, 1.添加maven依赖: 版本号可根据自己项目的实际 ...

  6. (附源码)springboot基于微信小程序的校园外卖系统 毕业设计091024

    Springboot基于微信小程序的校园外卖系统 摘要 随着生活质量的日益改善以及生活节奏的日益加快,人们对餐饮需求的质量以及速度也随之发生着变化.为了满足社会需求,餐饮的高质量和快节奏也渐渐使电话订 ...

  7. 基于SpringBoot和微信小程序的餐馆点餐系统的设计和实现

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  8. springboot基于微信小程序的校园外卖系统毕业设计源码091024

    Springboot基于微信小程序的校园外卖系统 摘要 随着生活质量的日益改善以及生活节奏的日益加快,人们对餐饮需求的质量以及速度也随之发生着变化.为了满足社会需求,餐饮的高质量和快节奏也渐渐使电话订 ...

  9. 【毕业设计】基于springboot + vue微信小程序商城

    目录 前言 创新点/亮点✨ 毕设目录 一.视频展示 二.系统介绍 三.项目地址 四.运行环境 五.设计模块 ①前台 ②后台 六.系统功能模块结构图 七. 准备阶段 ①使用真实支付 ②使用模拟支付 八. ...

最新文章

  1. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
  2. FFmpeg在Intel GPU上的硬件加速与优化
  3. 多线程环境下,程序真是危机四伏
  4. 巡回沙龙_美浮特全国巡回沙龙第一期结束撒花!
  5. Linux入门学习(四)
  6. Could not find artifact com.sun:tools:jar:1.5.0
  7. Redis 的 应用问题
  8. Desktop imags
  9. jdk LinkedList源码解析
  10. Nb iot php_NB-IoT是什么
  11. 作为项目经理如何做好项目进度管理
  12. 需求与商业模式创新-需求考试复习
  13. Rigify:关于Rigify生成最终绑定时失败的原因及解决办法
  14. 怎么把解压的文件在HTML打开,压缩文件怎么解压打开?
  15. 期货开户后需要银期转账绑定
  16. 关于char[]类型的排序 和字符串在使用时可能char*更好用
  17. Docker架设服务器系列
  18. Nginx搭建文件下载服务器
  19. Pollard rho整数分解法
  20. 超级产品:国内美妆行业正在发生什么变化?

热门文章

  1. 作为程序员的他凭什么成就年薪100W架构师?
  2. 8.0、软件测试——缺陷(定义和标准)
  3. 音乐flac怎么转为mp4?
  4. mall 三级分销插件设计
  5. 2020-09-26 项目实践(一)
  6. 图解windows 2000系统安装步骤
  7. 软件测试工程师到底要不要刷leetcode
  8. 监控(monitor)和可观测性(Observability)
  9. 图片怎样优化的8个小技巧
  10. python将eps文件转jpeg文件