首页 > 编程语言 >微信小程序支付V2版之JSAPI支付

微信小程序支付V2版之JSAPI支付

时间:2023-08-09 09:55:49浏览次数:39  
标签:openid ip 支付 程序 V2 微信 服务器

文章目录

  • 一、微信支付环境搭建
    • 1 企业微信小程序的开通
    • 2. 企业商户号的开通
    • 3 小程序号与商户号关联
  • 二、微信小程序的支付流程
    • 1 `JSAPI`支付流程
    • 2 微信小程序获取`openid`
    • 3 微信小程序下单
    • 4 后台服务程序对订单的处理
    • 5 微信小程序发起支付
    • 6 支付结果的通知
  • 三、微信支付API的使用
    • 1 导入微信官方提供的SDK
    • 2 控制器
  • 四、总结

 


一、微信支付环境搭建

  • 微信支付必须开通两个账号:微信小程序账号 与微信商户平台账号
  • 涉及到支付功能只能是公司,个人是不能玩支付功能,即个人的微信小程序号是不能开通微信支付功能的
  • 支付在线文档:https://pay.weixin.qq.com/wiki/doc/api/index.html

1 企业微信小程序的开通

  • 要认证:认证需要缴费
  • 获取appid:小程序的身份标识
  • 生成secret:生成后需要保存后
    在这里插入图片描述
  • 开通支付功能
    在这里插入图片描述
  • 关联商户号
    在这里插入图片描述

2. 企业商户号的开通

  • 要认证
  • 获取商户号:mch_id
  • 设置商户API秘钥:mch_key
  • APPID授权
  • 配置支付接口

3 小程序号与商户号关联

在这里插入图片描述


二、微信小程序的支付流程

JSAPI支付流程

  • 微信小程序JSAPI支付的在线文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_4
    在这里插入图片描述

  • 一个简单的流程如下
    在这里插入图片描述

  • 在实际项目开发中分为小程序开发与后台服务器的开发

2 微信小程序获取openid

  • 微信小程序的支付需要使用到openid,获取openid有两种方式
    • 微信小程序携带code登录开发者服务器开发者服务器请求微信服务器获取到openid,再将openid响应给微信小程序
    • 直接使用微信小程序的云开发功能获取到openid
  • 使用上述的第一种方式拿到openid,流程如下:
    在这里插入图片描述
  • 微信小程序的登录代码
    wx.login({ // 1. 微信小程序 → 微信服务器: 拿到临时凭证 codesuccess: res => { // 2. 微信服务器 → 微信小程序: 返回结果if(res.code) {wx.request({ // 3. 微信小程序 → 开发者服务器: 目的: 使用code换取openidurl: 'http://ycom.free.idcfengye.com/wechat/requestOpenId',data: { // 请求参数code:res.code},success: res=>{ // 4. 开发者服务器 → 微信小程序: 返回结果if(res.data.openid) {wx.setStorage({ // 5. 将开发者服务器返回的opneid存储起来, 之后的支付需要用到openidkey: 'openid',data: res.data.openid})}}})} }});
  • 开发者服务器后代代码
    /*** 小程序请求openid* 获取 openid 微信小程序的身份标识* 1. 小程序发送请求给开发者服务器* 2. 开发者服务器发送请求给微信服务器* 3. 微信服务器响应开发者服务器的请求* 4. 开发者服务器响应微信小程序的请求* 5. 微信小程序拿到了openid** @param code 临时code, 小程序传过来的* @return 给小程序返回openid*/@GetMapping("/requestOpenId")@ResponseBodyprivate Object requestOpenId(String code) {CloseableHttpClient httpclient = null;CloseableHttpResponse response = null;try {httpclient = HttpClients.createDefault();URI uri = new URIBuilder("https://api.weixin.qq.com/sns/jscode2session").addParameter("appid", Constants.appid).addParameter("secret", Constants.appSecret).addParameter("js_code", code).addParameter("grant_type", "authorization_code").build();HttpGet httpGet = new HttpGet(uri);// 执行请求: 开发者服务器给微信服务器发送GET请求response = httpclient.execute(httpGet);// 判断返回状态是否为200if (response.getStatusLine().getStatusCode() == 200) {// 解析响应数据String content = EntityUtils.toString(response.getEntity(), "UTF-8");JSONObject obj = (JSONObject) JSONObject.parse(content);obj.put("session_key", null); // session_key不需要暴露给微信小程序, 所以置nullreturn obj;}} catch (Exception e) {e.printStackTrace();} finally {if (response != null) {try {response.close();} catch (IOException e) {e.printStackTrace();}}if (httpclient != null) {try {httpclient.close();} catch (IOException e) {e.printStackTrace();}}}return null;}

3 微信小程序下单

  • 微信小程序下单的意思就是微信小程序请求开发者服务器:我有一笔款需要付给微信
    在这里插入图片描述

4 后台服务程序对订单的处理

    /*** 微信小程序下单请求* 1. 微信小程序发送请求给开发者服务器: 下单*      |- openid是必须的参数*      |- 金额: 微信小程序可以传进来也可以不传, 在这里金额是由服务端计算得到的* 2. 开发者服务器经过一顿操作后, 按照要求响应对应的数据给微信小程序* 3. 然后微信小程序拿着这一堆数据去请求微信服务器进行真正的付款操作** @param request* @param openid* @return* @throws Exception*/@GetMapping("/placeOrder")@ResponseBodypublic Object placeOrder(HttpServletRequest request, String openid) throws Exception {// 获取请求的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();}// 核心在这里return wxPayService.wxPay(openid, ip);}
  • 开发者服务器对微信小程序订单的处理代码
    public Map<String, String> wxPay(String openid, String ip) throws Exception {// 1. 拼接统一下单地址参数Map<String, String> paraMap = new HashMap<>();paraMap.put("body", "车库试验塔收费测试"); // 商家名称-销售商品类目 String(128)paraMap.put("openid", openid); // 用户登录的openidparaMap.put("out_trade_no", UUID.randomUUID().toString().replaceAll("-", ""));// 订单号, 每次都不同paraMap.put("spbill_create_ip", ip); // ip地址paraMap.put("total_fee", "1"); // 支付金额paraMap.put("trade_type", "JSAPI"); // 支付类型// 2. 通过MyWXPayConfig创建WxPay对象, 用于支付请求final String SUCCESS_NOTIFY = "http://ycom.free.idcfengye.com/wechat/notify"; // 微信小程序支付成功后的回调接口WXPayConfig wxPayConfig = new MyWXPayConfig();WXPay wxPay = new WXPay(wxPayConfig, SUCCESS_NOTIFY, false, false);// 3. 开发者服务器请求微信服务器: 统一下单// wxPay.fillRequestData(paraMap)是将上述的参数用key=value的形式和MCH_KEY一起加密为sign: 第一次加密Map<String, String> map = wxPay.unifiedOrder(wxPay.fillRequestData(paraMap), 15000, 15000);// 4. 向微信服务器发送统一下单请求后,得到响应, 从响应的结果中获取 预支付id, 即prepay_id// 将微信服务器返回的结果进行第二次加密String prepayId = map.get("prepay_id");Map<String, String> payMap = new HashMap<>();payMap.put("appId", WechatConstants.APPID);payMap.put("timeStamp", WXPayUtil.getCurrentTimestamp() + "");payMap.put("nonceStr", WXPayUtil.generateNonceStr());payMap.put("signType", WXPayConstants.HMACSHA256);payMap.put("package", "prepay_id=" + prepayId);String paySign = WXPayUtil.generateSignature(payMap, WechatConstants.MCH_KEY, WXPayConstants.SignType.HMACSHA256);payMap.put("paySign", paySign);// 5. 返回最终的结果: 这个结果最终返回给微信小程序return payMap;}

5 微信小程序发起支付

在这里插入图片描述

6 支付结果的通知

在这里插入图片描述

  • 开发者服务器支付通知回调的接口:

三、微信支付API的使用

1 导入微信官方提供的SDK

  • 微信支付V2版的API其实很简单,因为微信官方提供了相关的API:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1
    在这里插入图片描述
    在这里插入图片描述
  • 使用微信官方提供的SDK有两种方式:
    • 使用Maven引入SDK的依赖
    • 下载SDK与DEMO,将里面的源码拷贝到自己的工程中:com.github.wxpay.sdk,同时还需要在pom.xml文件中配置<license>
在这里插入图片描述在这里插入图片描述
  • 我们需要实现WXPayConfig类,因为在统一下单中需要使用到该类的实现类对象,那我们就必须提供一个该接口的实现类:实现如下
public class WechatPayConfig extends WXPayConfig {/*** 获取微信小程序的appid** @return*/@Overridepublic String getAppID() {return WechatConstants.APPID;}/*** 获取商户id** @return*/@Overridepublic String getMchID() {return WechatConstants.MCH_ID;}/*** 获取商户的秘钥** @return*/@Overridepublic String getKey() {return WechatConstants.MCH_KEY;}/*** 不需要证书** @return*/@Overridepublic InputStream getCertStream() {return null;}/*** 域名配置** @return*/@Overridepublic IWXPayDomain getWXPayDomain() {return new IWXPayDomain() {@Overridepublic void report(String domain, long elapsedTimeMillis, Exception ex) {}@Overridepublic DomainInfo getDomain(WXPayConfig config) {return new IWXPayDomain.DomainInfo(WXPayConstants.DOMAIN_API, true);}};}
}

2 控制器


四、总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

标签:openid,ip,支付,程序,V2,微信,服务器
From: https://www.cnblogs.com/Alex80/p/17616091.html

相关文章

  • uniapp中微信小程序取微信头像并上传到.net core后端
    uniapp中微信小程序取微信头像并上传到.netcore后端2023年08月09日后端net7测试成功,先记下来,以后要用的时候直接来这复制粘贴前端uniapp里的vue代码: <template><view><buttonclass="avatar-wrapper"open-type="chooseAvatar"@chooseavatar="o......
  • sick_scan_xd(西克雷达ros驱动编译)v2.91
    1.写在前面sick有多款的单线激光雷达以及多线雷达目前在低速的导航方向以及工业检测方便均有应用,ros系统是目前应用广泛的机器系统,因此sick也提供了多款雷达的rosdriver,通过了解该驱动可以解决开发时间。2.在window无ros环境编译准备vs2019社区版本或者专业板环境通过Develo......
  • ECCV2022 Real-RawVSR Dataset (Tianjin University)
    1.摘要近些年superresolution(SR)取得了很大进步,图像的SR真实世界数据集也有很多,相比来说视频要落后很多。本文构建了第一个真实世界的RAW视频SR数据集。数据集中包含450对RAW视频,LR图像有对应的2x/3x/4x的HR图像。本文提出一个两分支网络,分别处理packedRGGB序列和BayerRAW序列......
  • UESTC 2023 Summer Training #23 for div2/2022-2023 ACM-ICPC Latin American Region
    Preface今天这场签到巨多,和昨天那场形成了鲜明的对比但可惜后盘的时候我划了太久的水,最后接了B题然后没调出来成为战俘最气的是赛后发现原来是没注意输出格式,本来可以说一遍过的题结果没写过,属实可惜,就当长教训了以后一定要尤其注意输入输出格式A.AskingforMoneyORZ徐......
  • 微信开发之检测僵尸粉的技术实现
    简要描述:检测好友状态请求URL:http://域名地址/checkZombie请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String登录实例标识wcId是String好友微信id,多个已","分隔,每次最多支持......
  • 微信开发之检测僵尸粉的技术实现
    简要描述:检测好友状态请求URL:http://域名地址/checkZombie请求方式:POST请求头Headers:Content-Type:application/jsonAuthorization:login接口返回参数:参数名必选类型说明wId是String登录实例标识wcId是String好友微信id,多个已","分隔,每次最多支持个20请求参数示例{"wId":"0137......
  • 微信小程序15 做一个搜索框的样式
    一般来说首页上都会有搜索的功能,那么我们来加个搜索框试试在newlist上继续操作 简单搜索框的布局和样式页面上<viewclass="headClass"><inputtype="text"placeholder="请输入"></input></view>但是这样太丑了,完善一下样式.headClass{background-color:silver;......
  • 数字滚动插件vue-countup-v2
    参考博客https://blog.csdn.net/weixin_44948981/article/details/123544242options参数说明duration:2,//动画持续时间(秒)useEasing:true,//使用缓动效果useGrouping:true,//使用分组分隔符(如1,000)separator:',',//分组分隔符decimal:'.',//小数点符号pref......
  • IBM SPSS Statistics 27 (数据统计分析软件) v27.0.1 中文永久使用
    IBMSPSSStatistics27是一款功能强大的数据统计分析软件,被广泛应用于科学研究、市场调查、商业决策等领域。本文将对SPSSStatistics27进行800字详细介绍。点击获取IBMSPSSStatistics27 首先,SPSSStatistics27拥有丰富的数据分析工具和统计方法。用户可以导入各种格式......
  • 从零玩转系列之微信支付实战PC端支付微信退款接口搭建 | 技术创作特训营第一期
    一、前言从零玩转系列之微信支付实战PC端支付微信退款接口搭建|技术创作特训营第一期继前文章取消订单接口和查询订单接口此篇为申请退款流程,此篇文章过长我将分几个阶段的文章发布(项目源码都有,小程序和PC端)在此之前已经更新了微信支付开篇、微信支付安全、微信实战基础......