java-微信小程序支付代码分享

本文详细介绍了微信小程序支付的流程,包括小程序调用后台接口生成预支付订单,利用返回数据生成预支付订单,后台支付回调以及涉及的支付工具类。同时,提到了微信返回时间格式问题和统一下单接口的处理。
摘要由CSDN通过智能技术生成
按照微信支付的流程来进行:
1.小程序调用后台接口生成预支付订单:
package com.stonedt.controller;


import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;


import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


import com.alibaba.fastjson.JSON;
import com.stonedt.entity.HosOrder;
import com.stonedt.util.DateKit;
import com.stonedt.util.HttpClientsKit;
import com.stonedt.util.ResultUtil;
import com.stonedt.util.WxUtils;


public class Test {


	// 小程序appid
	public static final String appid = "";
	// app 密钥
	public static final String secret = "";
	// 微信支付的商户id
	public static final String mch_id = "";
	// 微信支付的商户密钥
	public static final String key = "";
	// 支付成功后的服务器回调url
	public static final String notify_url = "";
	// 签名方式,固定值
	public static final String SIGNTYPE = "MD5";
	// 交易类型,小程序支付的固定值为JSAPI
	public static final String trade_type = "JSAPI";
	// 微信统一下单接口地址
	public static final String pay_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
	// 微信统一下单接口地址
	public static final String body = "";
	// 交易类型 : 这里是微信小程序支付
	public static final String JSAPI = "JSAPI";


	/**
	 * 支付接口
	 * 
	 * @param openid  用户唯一标识
	 * @return
	 */
	@RequestMapping(value = "pay", produces = "text/json;charset=UTF-8")
	@ResponseBody
	public String pay(HttpServletRequest request,String openid) {


		// 商户订单号--->订单号唯一  
		//这里用时间戳模拟  商户订单号
		String out_trade_no = System.currentTimeMillis()+"";
		// 生成商户订单类      预支付信息组装    用于存入数据库 
		/**
		 * 这里省略 ....个人生成自己的 订单类存入数据
		 */
		// 生成随机串
		String nonce_str = WxUtils.getRandomStringByLength(32);
		// 获取用户后台IP地址(即使用微信小程序的手机IP)
		String spbill_create_ip = WxUtils.getIpAddr(request);


		// 组装参数,用户生成统一下单接口的签名
		Map<String, String> preParams = new HashMap<String, String>();
		
		//attach可以存储你想要在回调中获取的数据
		String attach = out_trade_no;


		preParams.put("appid", appid);
		preParams.put("attach", attach);
		preParams.put("mch_id", mch_id);
		preParams.put("nonce_str", nonce_str);
		preParams.put("body", body);
		preParams.put("out_trade_no", out_trade_no);
		preParams.put("total_fee", "1");// hospital.getHosPrice()
		preParams.put("spbill_create_ip", spbill_create_ip);// 用户ip
		preParams.put("notify_url", notify_url);
		preParams.put("trade_type", trade_type);
		preParams.put("openid", openid);


		// 参数按照参数名ASCII码从小到大排序拼接 (即key1=value1&key2=value2…)
		Map<String, String> cleanSignArray = WxUtils.cleanSignArray(preParams);
		String preSign = WxUtils.createLinkString(cleanSignArray);


		System.out.println(preSign);
		// MD5运算生成签名,这里是第一次签名,用于调用统一下单接口 --签名时 需要全部转换编码
		System.out.println(WxUtils.sign(preSign, key, "utf-8"));
		String fistSign = WxUtils.sign(preSign, key, "utf-8").toUpperCase(); // 问题商户密钥


		// 拼接统一下单接口使用的xml数据,和params存储的数据一样,并且排列顺序安装a.b.c.d...的从小到大顺序排列  要将上一步生成的签名fistSign一起拼接进去
		String xml = "<xml>" + "<appid><![CDATA[" + appid + "]]></appid>" + "<attach><![CDATA[" + attach
				+ "]]></attach>" + "<body><![CDATA[" + body + "]]></body>" + "<mch_id><![CDATA[" + mch_id
				+ "]]></mch_id>" + "<nonce_str><![CDATA[" + nonce_str + "]]></nonce_str>" + "<notify_url><![CDATA["
				+ notify_url + "]]></notify_url>" + "<openid><![CDATA[" + openid + "]]></openid>"
				+ "<out_trade_no><![CDATA[" + out_trade_no + "]]></out_trade_no>" + "<spbill_create_ip><![CDATA["
				+ spbill_create_ip + "]]></spbill_create_ip>" + "<total_fee><![CDATA[1]]></total_fee>"
				+ "<trade_type><![CDATA[" + JSAPI + "]]></trade_type>" + "<sign><![CDATA[" + fistSign + "]]></sign>"
				+ "</xml>";


		System.out.println("调试模式_统一下单接口 请求XML数据:" + xml);


		// 调用统一下单接口,并接受返回的结果 ---》发送请求时 参数需要转换统一编码
		String result = HttpClientsKit.httpRequest(pay_url, "POST", xml);


		System.out.println("调试模式_统一下单接口 返回XML数据:" + result);


		// 这里解析的是xml数据
		Map returnMap = WxUtils.doXMLParse(result);
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java 微信小程序支付代码可以通过以下几个步骤来实现: 第一步,注册微信小程序,并在后台开启微信支付功能。 第二步,下载并导入微信支付相关的 Java SDK,在项目中进行配置。 第三步,实现微信支付相关的接口调用,例如生成微信支付订单、获取支付状态等。 具体代码实现如下: 1. 导入微信支付 SDK ```java import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConfig; import com.github.wxpay.sdk.WXPayConstants; import com.github.wxpay.sdk.WXPayUtil; ``` 2. 实现微信支付相关接口: 定义一个接口 PayService,包含以下方法: ```java public interface PayService { // 生成微信支付订单 String createOrder(String openid, String outTradeNo, String spbillCreateIp, BigDecimal totalFee, String body, String notifyUrl) throws Exception; // 查询支付状态 Map<String, String> queryOrder(String outTradeNo) throws Exception; } ``` 代码实现如下: ```java @Service public class PayServiceImpl implements PayService { @Resource private WXPay wxPay; @Override public String createOrder(String openid, String outTradeNo, String spbillCreateIp, BigDecimal totalFee, String body, String notifyUrl) throws Exception { Map<String, String> data = new HashMap<String, String>(); data.put("openid", openid); data.put("out_trade_no", outTradeNo); data.put("spbill_create_ip", spbillCreateIp); data.put("total_fee", totalFee.multiply(new BigDecimal("100")).intValue() + ""); data.put("body", body); data.put("trade_type", "JSAPI"); data.put("notify_url", notifyUrl); Map<String, String> resultMap = wxPay.unifiedOrder(data); if(WXPayConstants.SUCCESS.equals(resultMap.get("return_code")) && WXPayConstants.SUCCESS.equals(resultMap.get("result_code"))) { String prepayId = (String) resultMap.get("prepay_id"); String timeStamp = String.valueOf(System.currentTimeMillis() / 1000); String nonceStr = WXPayUtil.generateNonceStr(); String signType = WXPayConstants.MD5; String sign = WXPayUtil.generateSignature(data, wxPayConfig.getKey(), signType); Map<String, String> result = new HashMap<String, String>(); result.put("appId", wxPayConfig.getAppID()); result.put("timeStamp", timeStamp); result.put("nonceStr", nonceStr); result.put("package", "prepay_id=" + prepayId); result.put("signType", signType); result.put("paySign", sign); return JSON.toJSONString(result); }else { throw new RuntimeException("生成预支付订单失败"); } } @Override public Map<String, String> queryOrder(String outTradeNo) throws Exception { Map<String, String> data = new HashMap<String, String>(); data.put("out_trade_no", outTradeNo); return wxPay.orderQuery(data); } } ``` 注意事项: - 生成预支付订单时,需要将金额单位转化为分。 - 生成签名时,需要使用MD5加密方式。 - 生成预支付订单成功后,需要返回给前端一个json格式的字符串,包含各种参数,前端再根据这些参数来调用微信支付API,完成支付。 - 查询支付状态时,需要传入订单号(outTradeNo),返回一个包含支付状态的 Map。 以上就是 Java 微信小程序支付代码的主要实现过程,当然根据具体业务需求,还需要根据微信支付官方文档进行调整,例如异步通知接口等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值