点击蓝色字关注我们!

一个努力中的公众号

长的好看的人都关注了

本文给大家讲解微信小程序支付全流程,以及相关功能源代码,项目不开放,带来不便尽请谅解。小程序支付主要包含如下几步骤,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)

//微信接口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>();//获取小程序的openId

params.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

*/@Override

public 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");

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

//签名类型,默认为MD5String 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:'',

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();}}

本文中所使用到的工具类,图图已经帮大家打包好了,一份在百度网盘,为防止百度网盘失效,在图图的QQ群中也有一份。

百度网盘下载链接

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

提取码:ljv6

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

如果对您有帮助 请点个关注,万分感谢

(QQ招聘群  710566091
                                 微信招聘群 请加图图微信)

jsapi支付签名_微信支付小程序支付全流程相关推荐

  1. 【微信小程序开发全流程】篇章0:基于JavaScript开发的校园综合类微信小程序的概览

    基于JavaScript开发的校园综合类微信小程序的概览 本文仅供学习,未经同意请勿转载 一些说明:上述项目来源于笔者我本科大三阶段2020年电子设计课程项目,在这个项目中,我主要是负责的部分有前端, ...

  2. 后台模拟页面登陆_微信直播小程序后台,微信朋友圈可直达小程序直播了

    独家了解到,微信广告正在测试直播模式,可以帮助商家将直播小程序置于多个广告流量级别,如朋友圈,公众账号和小程序. 这也意味着微信生态系统中的商家不仅可以通过小节目现场直播来运营私有域流量,而且可以利用 ...

  3. 微信小程序分析送积分功能如何实现_微信积分小程序特色功能——积分营销

    线下商家经常为营销手段单一而犯愁,微信积分小程序的积分营销功能相当出色,能为各大商家解决营销难题.积分商城是商家开展营销活动的手段之一,通过支付返积分,完成积分任务获得积分奖励,积分兑换商品或券等,使 ...

  4. c++如何让程序异常以后继续执行_微信商城小程序开发首页广告如何布局?c

    小程序的开发使得商家变现微信流量越来越便利,因此各类小程序制作数量不断增加,特别是不少商家选择制作商城类小程序.而在进行小程序制作的时候,是需要布局相应广告来进行流量转化的,那么微信商城小程序开发首页 ...

  5. 小程序分享功能怎么做_微信电影小程序怎么做?微信电影小程序项目收益图分享...

    在之前有给大家介绍了 <微信电影小程序这个项目> 可以说是非常的暴力,我们只需要搭建好了小程序,推广出去就可以坐等收益 下面给大家截图我实操这个项目的收益截图: 第一天收益: 第二天收益: ...

  6. 微信退款小程序支付/退款

    最近在写微信退款的时候发现了很多的Demo,但是方法都不同,而且很难确定Demo是不是适用自己的项目. 在发起退款的时候第一步自然还是先去下载证书,这个没话说,下载完成后在退款Controller可以 ...

  7. 微信服务商-小程序支付-商户传入的appid参数不正确,请联系商户处理

    报错:商户传入的appid参数不正确,请联系商户处理. 处理方式: 1. 2.需要在商户号,配置小程序的APPID https://pay.weixin.qq.com/static/pay_setti ...

  8. 小程序使用vant-dialog组件内容出不来_微信官方小程序同构新方案Kbone全解析

    导语 | 本文是Kbone作者june在云加社区微信群中的分享整理总结而成(编辑:尾尾).同时,june将出席11月16日的TWeb腾讯前端技术大会,欢迎现场交流. 大家好,我是来自腾讯微信小程序团队 ...

  9. 分享微信抽奖小程序制作步骤_微信抽奖小程序怎么开发

    各位商家在节日期间做活动的时候,都希望用更少的费用去或者更好的宣传和推广的效果.比较常见的就是抽奖活动小程序.无须玩家下载,通过微信扫码或者指定入口就可以参与. 方便,效果又好. 那么,性价比高的抽奖 ...

最新文章

  1. K-means聚类算法和模糊C-means聚类算法
  2. php根据修改时间删除指定目录下文件
  3. Ubuntu16安装anaconda没有这个文件或者目录
  4. 【转】idea激活搭建授权服务器
  5. ensp完成chap配置_广域网链路安全认证CHAP,一分钟了解下
  6. java本地方法不能是final_Java final关键字
  7. JavaScript 和 Java 有关系吗?
  8. ansible一键部署rsync服务剧本
  9. mongodb java 不等于_mongoDB在java上面的应用
  10. 起点中文网越来越火爆了,我利用Python直接把整站数据采集完毕
  11. OpenGL三维小球碰撞实现方法(glm、glfw)
  12. CactiEZ安装与配置-监控网卡流量
  13. Vue入门 computer计算属性
  14. 计算机类教学期刊,热门大学计算机教学论文参考文献 大学计算机教学核心期刊参考文献哪里找...
  15. 高德地图API定位失败(浏览器定位、IP定位)
  16. 如何可以快速解决网络劫持
  17. 12、计算机如何实现开根号?
  18. 吴恩达提出了著名的二八定律
  19. 【MySQL】6、Delete From删除语句
  20. 什么是Java SDK

热门文章

  1. Win7下硬盘安装Ubuntu10.10双系统
  2. TMDS——最小化传输差分信号及其协议
  3. (五)门级电路低功耗设计优化
  4. 庖丁解牛TLD(二)——初始化工作(为算法的准备)
  5. 【python数字信号处理】——线性卷积
  6. 301 302区别_如何正确理解301,302和canonial标签
  7. 门限回归模型的思想_Stata+R:门槛回归教程
  8. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波11 - 直方图处理 - 使用直方图统计量增强图像
  9. 计算机指令格式哪几部分组成,计算机的指令格式,通常是由()两部分组成。 - 百科题库网...
  10. omitting directory `folder/'