热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java调用微信支付代码

核心需求:用户点击按钮,生成一个二维码,微信扫码之后支付成功。要调用微信的接口,首先你需要引入微信支付的jar包࿰

核心需求:用户点击按钮,生成一个二维码,微信扫码之后支付成功。要调用微信的接口,首先你需要引入微信支付的jar包,如下:


  1. 引入微信支付的jar包

       

            com.github.wxpay

            wxpay-sdk

            0.0.3

       

2.开发工具类:

package com.example.ffmpeg;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import com.github.wxpay.sdk.WXPay;public class WXService {private static Logger logger = LoggerFactory.getLogger(WXService.class);private WXPay wxpay;private WXPayConfigImpl config;private static WXService INSTANCE; private WXService() throws Exception {config = WXPayConfigImpl.getInstance();wxpay = new WXPay(config);}public static WXService getInstance() throws Exception {if (INSTANCE == null) {synchronized (WXPayConfigImpl.class) {if (INSTANCE == null) {INSTANCE = new WXService();}}}return INSTANCE;}
3.下单接口:/*** * * @param out_trade_no* @param body* @param money* @param applyNo* @return*/public String doUnifiedOrder(String out_trade_no, String body, Double money, String applyNo) {String amt = String.valueOf(money * 100);HashMap data = new HashMap();data.put("body", body);data.put("out_trade_no", out_trade_no);data.put("device_info", "web");data.put("fee_type", "CNY");data.put("total_fee", amt.substring(0, amt.lastIndexOf(".")));data.put("spbill_create_ip", config.getSpbillCreateIp());data.put("notify_url", config.getNotifUrl());data.put("trade_type", config.getTradeType());data.put("product_id", applyNo);System.out.println(String.valueOf(money * 100));// data.put("time_expire", "20170112104120");try {Map r = wxpay.unifiedOrder(data);logger.info("返回的参数是" + r);return r.get("code_url");} catch (Exception e) {e.printStackTrace();logger.info(e.getMessage());return null;}}
4. 退款接口:public void doRefund(String out_trade_no, String total_fee) {logger.info("退款时的订单号为:" + out_trade_no + "退款时的金额为:" + total_fee);String amt = String.valueOf(Double.parseDouble(total_fee) * 100);logger.info("修正后的金额为:" + amt);logger.info("最终的金额为:" + amt.substring(0, amt.lastIndexOf(".")));HashMap data = new HashMap();data.put("out_trade_no", out_trade_no);data.put("out_refund_no", out_trade_no);data.put("total_fee", amt.substring(0, amt.lastIndexOf(".")));data.put("refund_fee", amt.substring(0, amt.lastIndexOf(".")));data.put("refund_fee_type", "CNY");data.put("op_user_id", config.getMchID());try {Map r = wxpay.refund(data);logger.info("退款操作返回的参数为" + r);} catch (Exception e) {e.printStackTrace();}}
4. 验证接口:/*** * @param out_trade_no* @param body* @param money* @param applyNo* @return* @throws DocumentException */public boolean checkSign(String strXML) throws DocumentException {SortedMap smap = new TreeMap();Document doc = DocumentHelper.parseText(strXML);Element root = doc.getRootElement();for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {Element e = (Element) iterator.next();smap.put(e.getName(), e.getText());}return isWechatSign(smap,config.getKey());}private boolean isWechatSign(SortedMap smap,String apiKey) {StringBuffer sb = new StringBuffer();Set> es = smap.entrySet();Iterator> it = es.iterator();while (it.hasNext()) {Entry entry = it.next();String k = (String) entry.getKey();String v = (String) entry.getValue();if (!"sign".equals(k) && null != v && !"".equals(v) && !"key".equals(k)) {sb.append(k + "=" + v + "&");}}sb.append("key=" + apiKey);/** 验证的签名 */String sign = MD5Util.MD5Encode(sb.toString(), "utf-8").toUpperCase();/** 微信端返回的合法签名 */String validSign = ((String) smap.get("sign")).toUpperCase();return validSign.equals(sign);}
}
4. 配置类:package com.example.ffmpeg;import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;import com.github.wxpay.sdk.WXPayConfig;public class WXPayConfigImpl implements WXPayConfig{private byte[] certData;private static WXPayConfigImpl INSTANCE;private WXPayConfigImpl() throws Exception{String certPath = "F:\\weixin\\apiclient_cert.p12";File file = new File(certPath);InputStream certStream = new FileInputStream(file);this.certData = new byte[(int) file.length()];certStream.read(this.certData);certStream.close();}public static WXPayConfigImpl getInstance() throws Exception{if (INSTANCE == null) {synchronized (WXPayConfigImpl.class) {if (INSTANCE == null) {INSTANCE = new WXPayConfigImpl();}}}return INSTANCE;}public String getAppID() {return "你的appid";}public String getMchID() {return "你的商户id";}public String getKey() {return "你设置的key值";}public String getNotifUrl() {return "微信通知回调的url接口";}public String getTradeType() {return "NATIVE";}public InputStream getCertStream() {ByteArrayInputStream certBis;certBis = new ByteArrayInputStream(this.certData);return certBis;}public int getHttpConnectTimeoutMs() {return 2000;}public int getHttpReadTimeoutMs() {return 10000;}// IWXPayDomain getWXPayDomain() {
// return WXPayDomainSimpleImpl.instance();
// }public String getPrimaryDomain() {return "api.mch.weixin.qq.com";}public String getAlternateDomain() {return "api2.mch.weixin.qq.com";}public int getReportWorkerNum() {return 1;}public int getReportBatchSize() {return 2;}public String getSpbillCreateIp() {// TODO Auto-generated method stubreturn "192.168.1.1";}
}
4. 配置类:
apiclient_cert.p12的证书文件。这个证书文件你可以登录微信的商户平台。在这里去下载你所需要的证书。WXPayConfigImpl 在构造方法里面去读取这个文件,所以构造方法抛了异常。因为构造器抛出异常,所以这里没有采用静态内部类而是采用双检锁的方式去实现单例。回到WXService这个类中,代码往下走,在WXService的构造器中对config和wxpay进行了实例化。接下来同样是用双检锁的方式实现的单例。往下走,微信的下单接口,分别传入out_trade_no(外部订单号),body(商品描述), money(付款金额), applyNo(对应微信的product_id:商品id,由商户自定义)四个参数。进入方法后第一句话String amt = String.valueOf(money * 100);是把传入的钱数乘以100,并转换成字符串。这里之所以乘以100是因为微信那边会把我们传过去的钱数除以100得到应付金额,且不能传小数,所以下面的那一句amt.substring(0, amt.lastIndexOf(“.”))就是为了把金额中的小数点去掉。往下走,new出了一个hashmap,将参数传入hashmap中,然后调用wxpay.unifiedOrder(data);下单接口下单。得到返回的map集合,从map中获得的code_url这个参数就是微信返回给我们生成二维码的字符串。这样,下单的整个流程就跑通了,现在写个测试类来测试一下。package com.example.ffmpeg;public class MyTest {public static void main(String[] args) throws Exception {WXService wx = WXService.getInstance();String QRcode = wx.doUnifiedOrder("test001", "测试下单接口", 0.01, "a123456");System.out.println("得到的二维码是:"+QRcode);}
}

 


推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
author-avatar
秋忆道格
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有