1. 程式人生 > >微信支付V3.x版本例項(上)

微信支付V3.x版本例項(上)

微信支付V3.x版本例項(使用SpringMVC+Maven+Jetty)
網頁內支付場景---JS API

顯示支付安全標題,需將原始連結新增上 "showwxpaytitle=1" 的尾串。通過這種方式,商戶頁面將出現微信安全支付標識。
例如:htp://weixin.qq.com?showwxpaytitle=1

微信支付實現過程步驟:

1.獲取微信支付配置引數;
微信支付引數需要的有3個:a.微信分配的公眾賬號ID(appid);b.微信支付分配的商戶號(mch_id/PartnerId);c.商戶金鑰(PartnerKey)

2.呼叫統一下單介面,生成預支付訂單號:

生成預支付訂單號關鍵程式碼:

package org.oms.app.service;

import java.util.Map;
import java.util.TreeMap;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.jdom2.JDOMException;
import org.jsoup.Jsoup;
import org.oms.app.util.MD5Util;
import org.oms.app.util.OrderUtil;
import org.oms.app.util.XMLUtil;
/**
 * 生成預支付訂單號
 * @author Sunlight
 *
 */
public class WXPrepay {
	private static String unifiedorder = "https://api.mch.weixin.qq.com/pay/unifiedorder";
	private static String orderquery = "https://api.mch.weixin.qq.com/pay/orderquery";
	private String appid;
	private String mch_id;
	private String nonce_str = OrderUtil.CreateNoncestr();
	private String body;
	private String out_trade_no;
	private String total_fee;
	private String spbill_create_ip;
	private String trade_type;
	private String notify_url;
	private String sign;
	private String partnerKey;
	// 預支付訂單號
	private String prepay_id;

	/**
	 * 生成預支付訂單
	 * 
	 * @return
	 */
	public String submitXmlGetPrepayId() {
		// 建立HttpClientBuilder
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		// HttpClient
		CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
		HttpPost httpPost = new HttpPost(unifiedorder);
		String xml = getPackage();
		StringEntity entity;
		try {
			entity = new StringEntity(xml, "utf-8");
			httpPost.setEntity(entity);
			HttpResponse httpResponse;
			// post請求
			httpResponse = closeableHttpClient.execute(httpPost);
			HttpEntity httpEntity = httpResponse.getEntity();
			if (httpEntity != null) {
				// 列印響應內容
				String result = EntityUtils.toString(httpEntity, "UTF-8");
				System.out.println(result);
				// 過濾
				result = result.replaceAll("<![CDATA[|]]>", "");
				String prepay_id = Jsoup.parse(result).select("prepay_id").html();
				this.prepay_id = prepay_id;
				if (prepay_id != null)
					return prepay_id;
			}
			// 釋放資源
			closeableHttpClient.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return prepay_id;
	}

	/**
	 * 請求訂單查詢介面
	 */
	@SuppressWarnings("unchecked")
	public Map<String, String> reqOrderquery() {
		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
		CloseableHttpClient closeableHttpClient = httpClientBuilder.build();
		HttpPost httpPost = new HttpPost(orderquery);
		String xml = getPackage();
		StringEntity entity;
		Map<String, String> map = null;
		try {
			entity = new StringEntity(xml, "utf-8");
			httpPost.setEntity(entity);
			HttpResponse httpResponse;
			// post請求
			httpResponse = closeableHttpClient.execute(httpPost);
			// getEntity()
			HttpEntity httpEntity = httpResponse.getEntity();
			if (httpEntity != null) {
				// 列印響應內容
				String result = EntityUtils.toString(httpEntity, "UTF-8");
				// 過濾
				result = result.replaceAll("<![CDATA[|]]>", "");
				try {
					map = XMLUtil.doXMLParse(result);
				} catch (JDOMException e) {
					e.printStackTrace();
				}
			}
			// 釋放資源
			closeableHttpClient.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return map;
	}

	public String getPackage() {
		TreeMap<String, String> treeMap = new TreeMap<String, String>();
		treeMap.put("appid", this.appid);
		treeMap.put("mch_id", this.mch_id);
		treeMap.put("nonce_str", this.nonce_str);
		treeMap.put("body", this.body);
		treeMap.put("out_trade_no", this.out_trade_no);
		treeMap.put("total_fee", this.total_fee);
		treeMap.put("spbill_create_ip", this.spbill_create_ip);
		treeMap.put("trade_type", this.trade_type);
		treeMap.put("notify_url", this.notify_url);
		StringBuilder sb = new StringBuilder();
		for (String key : treeMap.keySet()) {
			sb.append(key).append("=").append(treeMap.get(key)).append("&");
		}
		sb.append("key=" + partnerKey);
		sign = MD5Util.MD5Encode(sb.toString(), "utf-8").toUpperCase();
		treeMap.put("sign", sign);
		StringBuilder xml = new StringBuilder();
		xml.append("<xml>\n");
		for (Map.Entry<String, String> entry : treeMap.entrySet()) {
			if ("body".equals(entry.getKey()) || "sign".equals(entry.getKey())) {
				xml.append("<" + entry.getKey() + "><![CDATA[").append(entry.getValue()).append("]]></" + entry.getKey() + ">\n");
			} else {
				xml.append("<" + entry.getKey() + ">").append(entry.getValue()).append("</" + entry.getKey() + ">\n");
			}
		}
		xml.append("</xml>");
		System.out.println(xml.toString());
		return xml.toString();
	}

	public String getAppid() {
		return appid;
	}

	public void setAppid(String appid) {
		this.appid = appid;
	}

	public String getMch_id() {
		return mch_id;
	}

	public void setMch_id(String mch_id) {
		this.mch_id = mch_id;
	}

	public String getBody() {
		return body;
	}

	public void setBody(String body) {
		this.body = body;
	}

	public String getOut_trade_no() {
		return out_trade_no;
	}

	public void setOut_trade_no(String out_trade_no) {
		this.out_trade_no = out_trade_no;
	}

	public String getTotal_fee() {
		return total_fee;
	}

	public void setTotal_fee(String total_fee) {
		this.total_fee = total_fee;
	}

	public String getSpbill_create_ip() {
		return spbill_create_ip;
	}

	public void setSpbill_create_ip(String spbill_create_ip) {
		this.spbill_create_ip = spbill_create_ip;
	}

	public String getTrade_type() {
		return trade_type;
	}

	public void setTrade_type(String trade_type) {
		this.trade_type = trade_type;
	}

	public String getNotify_url() {
		return notify_url;
	}

	public void setNotify_url(String notify_url) {
		this.notify_url = notify_url;
	}

	public String getPartnerKey() {
		return partnerKey;
	}

	public void setPartnerKey(String partnerKey) {
		this.partnerKey = partnerKey;
	}
	
}


3.生成帶支付簽名的訂單憑據並返回

關鍵程式碼:

package org.oms.app.service;

import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import org.oms.app.util.MD5;
import org.oms.app.util.MD5Util;
import org.oms.app.util.OrderUtil;

import net.sf.json.JSONObject;

/**
 * 微信調起支付類
 * 
 * @author Sunlight
 * 
 */
public class WXPay {
	public static String createPackageValue(String appid, String appKey, String prepay_id)  {
		SortedMap<String, String> nativeObj = new TreeMap<String, String>();
		nativeObj.put("appId", appid);
		nativeObj.put("timeStamp", OrderUtil.GetTimestamp());
		Random random = new Random();
		String randomStr = MD5.GetMD5String(String.valueOf(random.nextInt(10000)));
		nativeObj.put("nonceStr", MD5Util.MD5Encode(randomStr, "utf-8").toLowerCase());
		nativeObj.put("package", "prepay_id=" + prepay_id);
		nativeObj.put("signType", "MD5");
		nativeObj.put("paySign", createSign(nativeObj, appKey));
		System.out.println(JSONObject.fromObject(nativeObj).toString());
		return JSONObject.fromObject(nativeObj).toString();
	}

	/**
	 * 建立md5摘要,規則是:按引數名稱a-z排序,遇到空值的引數不參加簽名。
	 */
	public static String createSign(SortedMap<String, String> packageParams, String AppKey) {
		StringBuffer sb = new StringBuffer();
		Set es = packageParams.entrySet();
		Iterator it = es.iterator();
		while (it.hasNext()) {
			Map.Entry entry = (Map.Entry) it.next();
			String k = (String) entry.getKey();
			String v = (String) entry.getValue();
			if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
				sb.append(k + "=" + v + "&");
			}
		}
		sb.append("key=" + AppKey);
		String sign = MD5Util.MD5Encode(sb.toString(), "UTF-8").toUpperCase();
		return sign;
	}
}


4.調起微信支付(發起微信支付請求)

5.使用者確認金額並輸入支付密碼

此處需要注意的是:配置支付測試目錄並填寫支付的3個引數!

相關推薦

支付V3.x版本例項()

微信支付V3.x版本例項(使用SpringMVC+Maven+Jetty) 網頁內支付場景---JS API 顯示支付安全標題,需將原始連結新增上 "showwxpaytitle=1" 的尾串。通過這種方式,商戶頁面將出現微信安全支付標識。 例如:htp://weixin.

支付V3版本地簽名統一下單android端詳解

滿滿的都是坑,因為伺服器偷懶讓客服端寫統一下單,伺服器只給了通知的url。微信的支付demo並沒有統一下單的程式碼。 讀此文前先閱讀 https://pay.weixin.qq.com/wiki/do

支付v3開發(6) 收貨地址共享接口

方式 word .com overflow rda over spa agent 電話 請看新版教程 微信支付開發(7) 收貨地址共享接口V2本文介紹微信支付下的收貨地址共享接口的開發過程。一. 簡單介紹微信收貨地址共享,是指用戶在微信瀏覽器內打開網頁,填寫過地址後,

支付v3開發(5) 掃碼並輸入金額支付

關鍵字:微信支付 微信支付v3 動態native支付 統一支付 Native支付 prepay_id 作者:方倍工作室   本文介紹微信支付下的掃描二維碼並輸入自定義金額的支付的開發過程。 注意 微信支付現在分為v2版和v3版,2014年9月10號之前申請的為v2版,

支付v3開發(6) 收貨地址共享介面

請看新版教程  微信支付開發(7) 收貨地址共享介面V2 本文介紹微信支付下的收貨地址共享介面的開發過程。 一. 簡介 微信收貨地址共享,是指使用者在微信瀏覽器內開啟網頁,填寫過地址後,後續可以免填寫支援快速選擇,也可增加和編輯。此地址為使用者屬性,可在各商戶的網頁中

php 開發之 支付 v3 配置

      公司需要微信支付現不到鎮的是非常的麻煩。然後呢那個要怎麼申請我就不寫了。因為不是我負責的所以我就記錄微信支付開發就好了。自己也記錄一下以後要開發好下手 。 1. 到這裡下載sdk        版本本V3 : http

支付V3公眾號支付PHP教程(thinkPHP5公眾號支付)/JSSDK的使用

掃二維碼關注,獲取更多技術分享 本文承接之前釋出的部落格《 微信支付V3微信公眾號支付PHP教程/thinkPHP5公眾號支付》必須閱讀上篇文章後才可以閱讀這篇文章。由於最近一段時間工作比較忙,部落格更新比較慢。如果有任何問題大家可以關注以上公眾

公眾號之支付(V3版)jsp頁面jsapi統一下單調啟支付(java版)

web專案 按順序一步一步來 準備: 申請了微信支付介面的微信公眾號一枚 , 備案的域名網站一枚, (如果有沒有的這兩個東西會耽誤你很久,因為微信支付必須是線上,無法本地除錯,)  這裡說一下 如果有經濟條件的最好申請一臺win系統的伺服器作為測試伺服器這樣會使你省去很

支付V3公眾號支付PHP教程/thinkPHP5公眾號支付

本篇文章是微信支付最新介面V3版本的PHP實踐教程,在該教程中主要使用的框架是thinkPHP5框架,如果你對thinkPHP5框架下的開發還不是很熟悉可以檢視相關的教程,當然在我的部落格中也有thinkPHP5的教程大家可以檢視。在本篇文章中我的主要目標

支付V3的WXUtil檔案

package cn.com.siyuan.eshop.weixinepay; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import jav

支付 java 服務端demo (v3版本app支付 springMVC框架中)

//靜態資源 /** * @author 徐小驥 * @version :2016-5-9 上午11:43:48 */ public class WeixinPayConstants { public static final String appid =

Java中的支付(1):API V3版本簽名詳解

![](https://img2020.cnblogs.com/other/1739473/202010/1739473-20201027122743032-1671834650.jpg) ## 1. 前言 最近在折騰微信支付,證書還是比較煩人的,所以有必要分享一些經驗,減少你在開發微信支付時的踩坑。目前

神了!這個接口用,普通商家的支付寶QQ百度京東都可以掃了

支付接口 微信支付接口 支付寶接口 杭州采寶支付 隨著移動支付的不斷發展,微信支付和支付寶支付已經占領了中國大部分市場,我們在各大商鋪和賣場都能看到微信掃碼支付、支付寶掃碼支付,對於顧客來講非常方便,不用帶現金,對於商家來講,也是十分便利,省去了找零的麻煩,但商家在接入支付寶和微信支付時,需要分別提交申請

tuition-獲取一個頁面傳來的id和支付

-c lac script template err 使用 conf color then <template> <div> <form-preview header-label="繳費信息" :header-value="payM

HBuilder基礎APP呼叫支付寶、支付(PHP)

支付寶後端程式碼: /** * @param Request $request * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View * 訂單頁面支付(支付寶支付) *

一個二維碼支援支付寶和支付

開發十年,就只剩下這套Java開發體系了 >>>        一個二維碼同時支援微信和支付寶掃描的原理很簡單,就是中間做了一個跳轉,判斷使用者用的是什麼瀏覽器請求的即可。     這裡首先要說清楚的是支

PHP支付開發例項

1.開發環境 Thinkphp 3.2.3  微信:服務號,已認證  開發域名:http://test.paywechat.com (自定義的域名,外網不可訪問) 2.需要相關檔案和許可權 微信支付需申請開通  微信公眾平臺開發者文件:htt

Java之史最全的支付+退款實戰。

廢話不多說直接上程式碼: 呼叫類: public class WeixinPayClient{        Logger log = Logger.getLogger(WeixinPayClient.class);   private st

網站對接支付寶,支付介面史最詳細教程

聯絡qq:1104752746對接支付寶支付介面,官方文件已經寫的很清楚了,但是也有很多像我一樣的小白,第一次對接支付寶支付介面,會有些迷茫,所以我在此寫下這篇文章,給我和我一樣的同學,一點思路吧。三分鐘就可以申請介面實用小技巧QQ:1104752746支付寶個人即時到賬支付

支付-免充值立減與折扣(篇)

前排:本篇文章將會主要介紹如何開通 免充值立減與折扣功能,具體使用請看微信支付-免充值立減與折扣(下篇)。 一 前言 專案需求:使用XX銀行卡支付可享受滿XX減XX優惠。 一開始看到這個需求,覺得一臉懵逼,不可思議,首先想到的問題是支付控制元件是微信的,我們只能在支