简单微信公众号支付

pom.xml

<!--  wewePay -->
<dependency>
   <groupId>com.egzosn</groupId>
   <artifactId>pay-java-common</artifactId>
   <version>2.12.1</version>
</dependency>
<dependency>
   <groupId>com.egzosn</groupId>
   <artifactId>pay-java-wx</artifactId>
   <version>2.12.1</version>
</dependency>

application.yml

# 公众号支付配置 公众账号ID(appid) 商户号(mch_id) key为商户平台设置的密钥key
#  key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
#  notify_url 回调地址
weixinpay:
  appid : XX  #正式
  mch_id : XX   #正式
  key : 591f8cb5bf174ff9a178f7b9bd0aa9cf  #正式
  notify_url :   https://XXX/notifyWeiXinPay  # 回调 测试


Weixinpay.java

package com.navitek.maternal.apiweb.bean;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @Author: syl
 * @Date: 2019/2/26 0026 15:09
 * @Description:
 */
@Data //lombok的
@Component
@ConfigurationProperties(prefix = "weixinpay")
public class Weixinpay {
  
    private String appId ;
    private String mch_id ;
    private String key ;
    private String notify_url ;




}

WayPayController 

package com.hs.weixin_pay;

import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.PayOrder;
import com.egzosn.pay.wx.api.WxPayConfigStorage;
import com.egzosn.pay.wx.api.WxPayService;
import com.egzosn.pay.wx.bean.WxTransactionType;
import com.hs.weixin_pay.service.WeixinPayBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.PostConstruct;
import java.math.BigDecimal;
import java.util.Map;
import java.util.UUID;

/**
 * @Author: syl
 * @Date: 2019/2/21 13:09
 * @Description:
 */
@Controller
public class WayPayController {
    @Autowired
    private WeixinPayBean weixinPayBean;

    private PayService service = null;

    @PostConstruct
    public void init() {
        WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage();
        wxPayConfigStorage.setMchId("XX");//
        wxPayConfigStorage.setAppid("XX");//appId
        wxPayConfigStorage.setKeyPublic("");
        wxPayConfigStorage.setSecretKey("XX");//key
        wxPayConfigStorage.setNotifyUrl("www");
        wxPayConfigStorage.setReturnUrl("同步回调地址");
        wxPayConfigStorage.setSignType("MD5");
        wxPayConfigStorage.setInputCharset("utf-8");
        service = new WxPayService(wxPayConfigStorage);

    }

    @RequestMapping(value = "tesss")
    public String tesstss(){
        return "wx/wxpay";
    }



    @RequestMapping(value = "testPay")
    @ResponseBody
    public Map testPay(){
        PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01) , UUID.randomUUID().toString().replace("-", ""));
        //网页支付
        order.setTransactionType(WxTransactionType.JSAPI);
        order.setOpenid("okmyawMfVE-Yd0fEXPH2U0LbQFYw");//openId
        //获取支付订单信息
        Map orderInfo = service.orderInfo(order);

        System.out.println("返回信息==="+orderInfo);
        //组装成html表单信息

        return orderInfo;
    }





}

 回调

 

@RequestMapping(value = "notifyWeiXinPay", produces = MediaType.APPLICATION_JSON_VALUE)
// @RequestDescription("支付回调地址")
@ResponseBody
public String notifyWeiXinPay(HttpServletRequest request, HttpServletResponse response) throws IOException, JDOMException {
    System.out.println("微信支付回调");
    InputStream inStream = request.getInputStream();
    ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int len = 0;
    while ((len = inStream.read(buffer)) != -1) {
        outSteam.write(buffer, 0, len);
    }
    String resultxml = new String(outSteam.toByteArray(), "utf-8");
    Map<String, String> params = PayCommonUtil.doXMLParse(resultxml);
    outSteam.close();
    inStream.close();
    System.out.println("支付通知返回"+String.valueOf(params));

    Map<String,String> return_data = new HashMap<>();
    if (!PayCommonUtil.isTenpaySign(params,weixinpay.getKey())) {
        // 支付失败
        return_data.put("return_code", "FAIL");
        return_data.put("return_msg", "return_code不正确");
        return StringUtil.GetMapToXML(return_data);
    } else {
        System.out.println("===============付款成功= 处理业务开始=============");
        int i = payOrderService.notifyWeiXinPay(params);
        if(i>0){
            System.out.println("====================订单操作成功=================");
        }
        return_data.put("return_code", "SUCCESS");
        return_data.put("return_msg", "OK");
        return StringUtil.GetMapToXML(return_data);
    }
}

工具类方法也给你们 

//xml解析
public static Map doXMLParse(String strxml) throws JDOMException, IOException {
    strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");

    if(null == strxml || "".equals(strxml)) {
        return null;
    }

    Map m = new HashMap();

    InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));
    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(in);
    Element root = doc.getRootElement();
    List list = root.getChildren();
    Iterator it = list.iterator();
    while(it.hasNext()) {
        Element e = (Element) it.next();
        String k = e.getName();
        String v = "";
        List children = e.getChildren();
        if(children.isEmpty()) {
            v = e.getTextNormalize();
        } else {
            v = getChildrenText(children);
        }

        m.put(k, v);
    }

    //关闭流
    in.close();

    return m;
}

html  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>weixin pay</title>
    <script src="https://cdn.bootcss.com/jquery/1.11.0/jquery.min.js"></script>
	<script type="text/javascript">
	function onBridgeReady(appId,timeStamp,nonceStr,package,signType,paySign){
		//var d = new Date()
		//var time = parseInt(d.getTime()/1000);
		var params = {
	         "appId":appId,     //公众号名称,由商户传入     
	         "timeStamp":timeStamp,         //时间戳,自1970年以来的秒数     
	         "nonceStr":nonceStr, //随机串     
	         "package":package,     
	         "signType":signType,         //微信签名方式:     
	         "paySign":paySign //微信签名 
	      };

	      //alert(params);
	    WeixinJSBridge.invoke(
	      'getBrandWCPayRequest', params,
	      function(res){
	      	//get_brand_wcpay_request:ok	支付成功
			//get_brand_wcpay_request:cancel	支付过程中用户取消
			//get_brand_wcpay_request:fail	支付失败
		      if(res.err_msg == "get_brand_wcpay_request:ok" ){
		     	// 使用以上方式判断前端返回,微信团队郑重提示: res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
		     	 alert("支付成功");
		      }else if(res.err_msg == "get_brand_wcpay_request:cancel" ){
            	 alert("取消支付");
		      }else if(res.err_msg == "get_brand_wcpay_request:fail" ){
            	 alert("支付失败");
          	  }
          	  //alert(res.err_msg);
	     }); 
	}
	function prepay(){
		//判断是否是微信浏览器
		if (typeof WeixinJSBridge == "undefined"){
		   if( document.addEventListener ){
		       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
		   }else if (document.attachEvent){
		       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
		       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
		   }
		   console.log(0);
		   //return;
		}else{
		   console.log(1);
		}
		var d = new Date()
		var time = parseInt(d.getTime()/1000);
		var product_id = "KC002"+time;
		var open_id = "okmyawHNYzWkEdVj2Gdj9jT7Q1XI";
		
		$.ajax({
			  url:"testPay",
			  type:"post",
			  success:function(result){
			  	alert("访问");
			     if(result.package){
                     alert(result.package);
                     var data = result;
			     	var appId     = data.appId      ;
			     	var timeStamp = data.timeStamp      ;
			     	var nonceStr = data.nonceStr  ;
			     	var package  = data.package       ;
			     	var signType = data.signType  ;
			     	var paySign = data.sign ;
		     		onBridgeReady(appId,timeStamp,nonceStr,package,signType,paySign);
		         }else{
		         
			     }
			  }
	    });

	}
	function refresh_weixin() {
	    var random = Math.floor((Math.random() * 10000) + 1);
	    var url_random = "random="+random;
	    var url = decodeURI(window.location.href);
	    var i = url.indexOf('?');
	    var j = url.indexOf('random=');
	    if (i>-1) {
	    	if(j>-1){
		        url = url.substr(0,j-1) + "&" + url_random;
	    	}else{
		        url = url + "&" + url_random;
	    	}
	    } else {
	        url = url + "?" + url_random;
	    }
	    window.location.href = url;
	}
	</script>
  </head>
  
  <body>
    This is my weixin pay page. <br>
    <input type="button" value="支付" onclick="prepay()">
    <input type="button" value="刷新" onclick="refresh_weixin()">
  </body>
</html>

 注意:微信支付账号的回调地址一定要配置上html所在项目的服务器的地址,否则会报url不在支付配置地址中,造成支付失败。

 参考资料较多,记录一下以后直接用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
让你真正做到一行代码实现支付聚合,让你可以不用理解支付怎么对接,只需要专注你的业务 全能第三方支付对接pay-spring-boot-starter开发工具包 开发工具在软件开发生命周期中扮演着至关重要的角色,它们旨在简化和加速从概念设计到产品部署的各个环节。以下是开发工具的主要作用: 代码编写与编辑: 提供集成开发环境(IDE),如Visual Studio、Eclipse、Android Studio和Sublime Text等,这些工具集成了文本编辑器,支持语法高亮、自动补全、代码片段管理和版本控制等功能,有助于开发者高效编写和维护代码。 项目管理: 支持项目创建、组织、构建自动化以及依赖管理,确保不同模块和组件之间的协调一致。 编译与构建: 包括编译器、构建工具(如Make、Gradle、Maven)等,用于将源代码转换为可执行文件或库,并进行资源打包、优化等处理。 调试与测试: 集成调试器允许开发者逐行执行代码,设置断点、查看变量值、跟踪调用堆栈等,帮助定位并修复代码中的错误。 测试框架和工具则协助开发者编写和运行单元测试、集成测试及性能测试,确保软件质量。 版本控制与协作: 通过集成Git、SVN等版本控制系统,支持团队成员间的代码共享、分支管理、合并请求和冲突解决。 可视化设计与原型制作: 对于UI/UX设计,有界面设计工具,如Sketch、Adobe XD,可以帮助设计师快速构建应用程序界面模型,并生成规范的设计稿供开发人员参考实现。 跨平台支持: 跨平台开发工具如Xamarin、React Native和Flutter,让开发者使用一种语言或框架编写可以在多个操作系统上运行的应用程序。 文档编写与API管理: 文档生成工具可以自动生成代码注释文档,便于团队内外理解和使用项目代码。 API管理工具则方便开发者创建、测试、发布和维护API接口。 持续集成与持续部署(CI/CD): Jenkins、Travis CI、GitHub Actions等工具负责自动化构建、测试和部署流程,提高交付效率和可靠性。 数据库管理与ORM工具: 数据库客户端工具用于连接、查询、更新数据库,ORM(对象关系映射)工具简化了数据操作和持久化层的开发工作。 总之,开发工具极大地提升了软件工程师的工作效率,保证了开发过程中的准确性与一致性,同时也促进了团队合作,使得软件开发更系统化、规范化和工业化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

somdip

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值