#后台调用支付流程的代码

上班一直用到微信 银联调用支付接口的问题 写了一个方法 在此做下记录
 

package com.zte.xh.micromall.core.utils;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;

import net.sf.json.JSONObject;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang.StringUtils;

public class MicroWeichatUtils {
	/**
	 *
	 * @param url
	 *            地址
	 * @param params
	 *            返回的结果中需要哪些返回值,不加密的https调用
	 * @param resultType
	 *            response响应的结果是什么类型的,一般是json或者xml
	 * @return 其实这里还需要加一个http请求类型的参数,来判断是http请求还是https的请求,目前微信都是https的 所以没添加
	 */
	public static Map<String, String> getParam(String url, String resultType,
			String... params) {
		try {
			URL console = new URL(url);
			HttpsURLConnection conn = (HttpsURLConnection) console
					.openConnection();
			conn.setRequestMethod("GET");// get方式提交
			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setInstanceFollowRedirects(true);
			conn.connect();

			BufferedReader reader = new BufferedReader(new InputStreamReader(
					conn.getInputStream(), "UTF-8"));
			String line;
			StringBuffer responseText = new StringBuffer();
			while ((line = reader.readLine()) != null) {
				responseText.append(line).append("\r\n");
			}
			reader.close();
			conn.disconnect();
//			System.out.println("响应结果responseText--------------"
//					+ responseText.toString());
			String result = responseText.toString();
			Map<String, String> resultM = new HashMap<String, String>();
			if (StringUtils.isNotEmpty(result)) {
				// 解析获取到的json
				JSONObject jsonObject = JSONObject.fromObject(result);
				for (String param : params) {
					resultM.put(param, jsonObject.getString(param));
//					System.out.println(param + "--------"
//							+ jsonObject.getString(param));
				}
			}
			return resultM;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 字典排序
	 * 
	 * @param hm
	 * @param kl
	 * @param key
	 * @return
	 */
	public static String getSign(Map<String, String> hm, List<String> kl) {
		// 排序
		String[] kls = kl.toArray(new String[] {});
		Arrays.sort(kls);
		// 拼接处待加密的String
		StringBuffer sb = new StringBuffer();
		for (String k : kls) {
			sb.append(k);
			sb.append("=");
			sb.append(hm.get(k));
			sb.append("&");
		}
		String stringSignTemp = sb.toString();
		// 去掉最后的一个&
		stringSignTemp = stringSignTemp.substring(0,
				stringSignTemp.length() - 1);
//		System.out.println("字典排序后-------" + stringSignTemp);
		// 进行sha1加密
		String asignature = DigestUtils.shaHex(stringSignTemp);
//		System.out.println("加密后的signature---" + asignature);
		return asignature;
	}

// 这是需要加密文件的方法,XML表示传递的参数为xml类型的字符串,通过httpclient来实现的  
private String addMenu(String URL, String XML, String mch_id)
			throws Exception {
                //有的需要的代理
                //System.setProperty("proxyHost", "");
		//System.setProperty("proxyPort", "80");
		//System.setProperty("proxyUser", "");
		//System.setProperty("proxyPassword", "!");

		String result = null;
		KeyStore keyStore = KeyStore.getInstance("PKCS12");

		// 读取配置文件的路劲
		Map params = this.paymentManager.getConfigParams(this.getId());
		String merPath = (String) params.get("merPath");

		FileInputStream instream = new FileInputStream(new File(merPath));
		try {
			keyStore.load(instream, mch_id.toCharArray());
		} finally {
			instream.close();
		}
		SSLContext sslcontext = SSLContexts.custom()
				.loadKeyMaterial(keyStore, mch_id.toCharArray()).build();
		SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
				sslcontext, new String[] { "TLSv1" }, null,
				SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
		CloseableHttpClient httpclient = HttpClients.custom()
				.setSSLSocketFactory(sslsf).build();
		try {
			HttpPost httppost = new HttpPost(URL);
			StringEntity entity = new StringEntity(XML.toString(), "utf-8");
			httppost.setEntity(entity);
			HttpResponse response = httpclient.execute(httppost);
			HttpEntity resEntity = response.getEntity();
			if (resEntity != null) {
				result = EntityUtils.toString(resEntity);
			}
		} finally {
			httpclient.close();
		}
		return result;
	}


	public static void main(String[] args) {
				String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
						+ appid + "&secret=" + secret;
				Map<String, String> tokenMap = MicroWeichatUtils.getParam(url,
						"json", "access_token");
				if (tokenMap != null
						&& StringUtils.isNotEmpty(tokenMap.get("access_token"))) {
					String accessToken = tokenMap.get("access_token");
					// 获取ticket
					url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="
							+ accessToken + "&type=jsapi";
					// 自定义调用微信接口方法
					Map<String, String> ticketMap = MicroWeichatUtils.getParam(
							url, "json", "ticket");
					String ticket = ticketMap.get("ticket");
					WxConstant.setWxAccessToken(accessToken);
					WxConstant.setWxTicket(ticket);
				}

	}
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是 Java 微信小程序支付流程代码示例,仅供参考: 1. 用户在小程序内提交订单,小程序后台将订单信息发送给服务端: ```java // 小程序后台调用服务端接口,提交订单信息 String url = "http://yourserver.com/order"; Map<String, Object> data = new HashMap<>(); data.put("orderId", "123456"); data.put("totalFee", "100"); data.put("body", "测试订单"); String result = HttpUtils.sendPostRequest(url, data); ``` 2. 服务端接收到订单信息后,生成预支付订单并返回给小程序: ```java // 服务端生成预支付订单并返回给小程序 String prepayId = WeixinPayUtils.getPrepayId("测试订单", "123456", "100"); Map<String, String> resultMap = new HashMap<>(); resultMap.put("appId", WeixinPayConfig.APP_ID); resultMap.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000)); resultMap.put("nonceStr", WeixinPayUtils.generateNonceStr()); resultMap.put("package", "prepay_id=" + prepayId); resultMap.put("signType", "MD5"); resultMap.put("paySign", WeixinPayUtils.generateSign(resultMap)); String result = JsonUtils.toJson(resultMap); ``` 3. 小程序调用微信支付接口,发起支付请求: ```java // 小程序调用微信支付接口,发起支付请求 wx.requestPayment({ 'timeStamp': 'result.timeStamp', 'nonceStr': 'result.nonceStr', 'package': 'result.package', 'signType': 'MD5', 'paySign': 'result.paySign', 'success': function(res) { console.log(res); }, 'fail': function(res) { console.log(res); } }); ``` 4. 微信支付平台返回支付结果给小程序,小程序将支付结果发送给服务端: ```java // 微信支付平台返回支付结果给小程序,小程序将支付结果发送给服务端 wx.request({ url: 'http://yourserver.com/pay/result', method: 'POST', data: { orderId: '123456', transactionId: res.transaction_id, result_code: res.result_code }, success: function(res) { console.log(res); }, fail: function(res) { console.log(res); } }); ``` 5. 服务端接收到支付结果后,更新订单状态,完成支付流程: ```java // 服务端接收到支付结果后,更新订单状态,完成支付流程 String orderId = request.getParameter("orderId"); String transactionId = request.getParameter("transactionId"); String resultCode = request.getParameter("result_code"); if ("SUCCESS".equals(resultCode)) { // 支付成功,更新订单状态 Order order = orderService.getOrderById(orderId); order.setStatus(OrderStatus.PAID); order.setTransactionId(transactionId); orderService.updateOrder(order); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值