具體方法步驟:
屯留ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
一、準(zhǔn)備階段:已認(rèn)證微信號,且通過微信支付認(rèn)證,這個可以看微信文檔,很詳細(xì),這里就不再重復(fù)。
二、配置授權(quán)目錄,官方推薦使用https類型的url,不知道http能不能行,個人也推薦使用https的保證不會錯。
配置授權(quán)域名
三、微信支付二次開發(fā)所需要的參數(shù):
APP_ID,APP_KEY,PARTNER,PARTNER_KEY(AppSecret)
APP_ID和PARTNER_KEY(AppSecret)
PARTNER
APP_KEY(自行設(shè)置32位字符)
四、具體編程
1、通過頁面跳轉(zhuǎn)到確認(rèn)支付頁面,其中的redirect_uri必須是配置授權(quán)目錄下的。
2、獲取到openid,再經(jīng)服務(wù)器向微信請求獲取prepay_id,封裝字段并進(jìn)行簽名后通過jsapi調(diào)起微信支付
3、測試結(jié)果
? ?
java調(diào)用微信支付接口方法:
RequestHandler requestHandler = new RequestHandler(super.getRequest(),super.getResponse());
//獲取token //兩小時內(nèi)有效,兩小時后重新獲取
Token = requestHandler.GetToken();
//更新token 到應(yīng)用中
requestHandler.getTokenReal();
System.out.println("微信支付獲取token=======================:" +Token);
//requestHandler 初始化
requestHandler.init();
requestHandler.init(appid,appsecret, appkey,partnerkey, key);
// --------------------------------本地系統(tǒng)生成訂單-------------------------------------
// 設(shè)置package訂單參數(shù)
SortedMapString, String packageParams = new TreeMapString, String();
packageParams.put("bank_type", "WX"); // 支付類型
packageParams.put("body", "xxxx"); // 商品描述
packageParams.put("fee_type", "1"); // 銀行幣種
packageParams.put("input_charset", "UTF-8"); // 字符集
packageParams.put("notify_url", ""); // 通知地址 這里的通知地址使用外網(wǎng)地址測試,注意80端口是否打開。
packageParams.put("out_trade_no", no); // 商戶訂單號
packageParams.put("partner", partenerid); // 設(shè)置商戶號
packageParams.put("spbill_create_ip", super.getRequest().getRemoteHost()); // 訂單生成的機(jī)器IP,指用戶瀏覽器端IP
packageParams.put("total_fee", String.valueOf(rstotal)); // 商品總金額,以分為單位
// 設(shè)置支付參數(shù)
SortedMapString, String signParams = new TreeMapString, String();
signParams.put("appid", appid);
signParams.put("noncestr", noncestr);
signParams.put("traceid", PropertiesUtils.getOrderNO());
signParams.put("timestamp", timestamp);
signParams.put("package", packageValue);
signParams.put("appkey", this.appkey);
// 生成支付簽名,要采用URLENCODER的原始值進(jìn)行SHA1算法!
String sign ="";
try {
sign = Sha1Util.createSHA1Sign(signParams);
} catch (Exception e) {
e.printStackTrace();
}
// 增加非參與簽名的額外參數(shù)
signParams.put("sign_method", "sha1");
signParams.put("app_signature", sign);
// api支付拼包結(jié)束------------------------------------
//獲取prepayid
String prepayid = requestHandler.sendPrepay(signParams);
System.out.println("prepayid :" + prepayid);
// --------------------------------生成完成---------------------------------------------
//生成預(yù)付快訂單完成,返回給android,ios 掉起微信所需要的參數(shù)。
SortedMapString, String payParams = new TreeMapString, String();
payParams.put("appid", appid);
payParams.put("noncestr", noncestr);
payParams.put("package", "Sign=WXPay");
payParams.put("partnerid", partenerid);
payParams.put("prepayid", prepayid);
payParams.put("appkey", this.appkey);
//這里除1000 是因?yàn)閰?shù)長度限制。
int time = (int) (System.currentTimeMillis() / 1000);
payParams.put("timestamp",String.valueOf(time));
System.out.println("timestamp:" + time);
//簽名
String paysign ="";
try {
paysign = Sha1Util.createSHA1Sign(payParams);
} catch (Exception e) {
e.printStackTrace();
}
payParams.put("sign", paysign);
//拼json 數(shù)據(jù)返回給客戶端
BasicDBObject backObject = new BasicDBObject();
backObject.put("appid", appid);
backObject.put("noncestr", payParams.get("noncestr"));
backObject.put("package", "Sign=WXPay");
backObject.put("partnerid", payParams.get("partnerid"));
backObject.put("prepayid", payParams.get("prepayid"));
backObject.put("appkey", this.appkey);
backObject.put("timestamp",payParams.get("timestamp"));
backObject.put("sign",payParams.get("sign"));
String backstr = dataObject.toString();
System.out.println("backstr:" + backstr);
return backstr;
====================到此為止,預(yù)付款訂單已生成,并且已返回客戶端====================
//坐等微信服務(wù)器通知,通知的地址就是生成預(yù)付款訂單的notify_url
ResponseHandler resHandler = new ResponseHandler(request, response);
resHandler.setKey(partnerkey);
//創(chuàng)建請求對象
//RequestHandler queryReq = new RequestHandler(request, response);
//queryReq.init();
if (resHandler.isTenpaySign() == true) {
//商戶訂單號
String out_trade_no = resHandler.getParameter("out_trade_no");
System.out.println("out_trade_no:" + out_trade_no);
//財(cái)付通訂單號
String transaction_id = resHandler.getParameter("transaction_id");
System.out.println("transaction_id:" + transaction_id);
//金額,以分為單位
String total_fee = resHandler.getParameter("total_fee");
//如果有使用折扣券,discount有值,total_fee+discount=原請求的total_fee
String discount = resHandler.getParameter("discount");
//支付結(jié)果
String trade_state = resHandler.getParameter("trade_state");
//判斷簽名及結(jié)果
if ("0".equals(trade_state)) {
//------------------------------
//即時到賬處理業(yè)務(wù)開始
//------------------------------
System.out.println("----------------業(yè)務(wù)邏輯執(zhí)行-----------------");
//——請根據(jù)您的業(yè)務(wù)邏輯來編寫程序(以上代碼僅作參考)——
System.out.println("----------------業(yè)務(wù)邏輯執(zhí)行完畢-----------------");
System.out.println("success"); // 請不要修改或刪除
System.out.println("即時到賬支付成功");
//給財(cái)付通系統(tǒng)發(fā)送成功信息,財(cái)付通系統(tǒng)收到此結(jié)果后不再進(jìn)行后續(xù)通知
resHandler.sendToCFT("success");
//給微信服務(wù)器返回success 否則30分鐘通知8次
return "success";
}else{
System.out.println("通知簽名驗(yàn)證失敗");
resHandler.sendToCFT("fail");
response.setCharacterEncoding("utf-8");
}
}else {
System.out.println("fail -Md5 failed");
微信支付jsapi(java版),具體代碼如下:
代碼太多,更多代碼請?jiān)L問
1.?項(xiàng)目使用springmvc?restful風(fēng)格的,需要用到j(luò)ar包請自行下載
2.?整個項(xiàng)目只需要修改com.tenpay.configure.WxPayConfig中的配置信息就行。
//?appid
public?static?String?APP_ID?=?"公眾id";
//?JSAPI接口中獲取openid,審核后在公眾平臺開啟開發(fā)模式后可查看
public?static?String?APP_SECRET?=?"公眾號中的秘鑰";
//?受理商ID,身份標(biāo)識
public?static?String?MCH_ID?=?"商戶id";
//?商戶支付密鑰Key,裝完整數(shù)后,配置得到。32位長度
public?static?String?KEY?=?"商戶平臺中配置證書,設(shè)置的秘鑰";
//?異步回調(diào)地址
public?static?String?NOTIFY_URL?=?"支付成功后的回調(diào)action";
public?static?String?CHARTSET?=?"UTF-8";
//?加密方式
public?static?String?SIGN_TYPE?=?"MD5";
//?redirect_uri,微信授權(quán)重定向地址
public?static?String?REDIRECT_URI;
static?{
try?{
REDIRECT_URI?=?URLEncoder.encode("微信授權(quán)成功后重定向的action",?CHARTSET);
}?catch?(UnsupportedEncodingException?e)?{
e.printStackTrace();
}
}
3.?項(xiàng)目核心類com.tenpay.action.WxPayAction
pay函數(shù):支付前準(zhǔn)備函數(shù),從數(shù)據(jù)庫獲取訂單號,查詢訂單金額,訂單描述、openid、prepay_id等等。
notify函數(shù):支付成功后異步回調(diào)函數(shù)。
一、新建基于springMVC框架的javaweb項(xiàng)目名字為wxPay
二、java代碼實(shí)現(xiàn)
2.1?com.tenpay.action.WxPayAction代碼
package?com.tenpay.action;
import?java.io.ByteArrayOutputStream;
import?java.io.IOException;
import?java.io.InputStream;
import?java.io.UnsupportedEncodingException;
import?java.util.Map;
import?java.util.SortedMap;
import?java.util.TreeMap;
import?javax.servlet.http.HttpServletRequest;
import?javax.servlet.http.HttpServletResponse;
import?org.jdom2.JDOMException;
import?org.springframework.stereotype.Controller;
import?org.springframework.web.bind.annotation.RequestMapping;
import?com.tenpay.RequestHandler;
import?com.tenpay.configure.WxPayConfig;
import?com.tenpay.service.ServiceUtil;
import?com.tenpay.util.MD5Util;
import?com.tenpay.util.Sha1Util;
import?com.tenpay.util.XMLUtil;
import?net.sf.json.JSONObject;
/*******************************************************************************
*?b類名:?WxPayAction.java/b?br/
*?功能:微信支付,調(diào)用jsapibr/
*?日期:br/
*?
*?@author?V型知識庫?
*?@version?1.0
*?
******************************************************************************/
@Controller
@RequestMapping("/v_3")
public?class?WxPayAction?{
/**
*?微信客戶端授權(quán)成功后根據(jù)redirect_uri參數(shù)調(diào)整到pay接口,去準(zhǔn)備支付前信息接口
*?@param?request
*?@param?response
*?@return
*?@throws?Exception
*/
@RequestMapping("pay")
public?String?order(HttpServletRequest?request,?HttpServletResponse?response)?throws?Exception?{
/**
*?第一步:用戶同意授權(quán),根據(jù)參數(shù),獲取code
*?授權(quán)成功后返回的授權(quán)碼,參考:
*/
String?code?=?request.getParameter("code");
String?state?=?request.getParameter("state");
//?state可以為任何含義,根據(jù)你前端需求,這里暫時叫商品id
//?授權(quán)碼、商品id
System.out.println("code="?+?code?+?",state="?+?state);
/**
*?第二步:通過code換取網(wǎng)頁授權(quán)access_token
*?根據(jù)授權(quán)碼code獲取access_token,參考:
*/
//?下面就到了獲取openid,這個代表用戶id.
//?獲取openID
String?openid?=?ServiceUtil.getOpenId(code);
//?生成隨機(jī)字符串
String?noncestr?=?Sha1Util.getNonceStr();
//?生成1970年到現(xiàn)在的秒數(shù).
String?timestamp?=?Sha1Util.getTimeStamp();
//?訂單號,自定義生成規(guī)則,只要全局唯一就OK
String?out_trade_no?=?"NO"?+?System.currentTimeMillis()?+?"0001";
//?訂單金額,應(yīng)該是根據(jù)state(商品id)從數(shù)據(jù)庫中查詢出來
String?order_price?=?String.valueOf(1);
//?商品描述,應(yīng)該是根據(jù)state(商品id)從數(shù)據(jù)庫中查詢出來
String?body?=?"商品描述,測試....";
/**
*?第三步:統(tǒng)一下單接口
*?需要第二步生成的openid,參考:
*/
RequestHandler?reqHandler?=?new?RequestHandler(request,?response);
//?初始化?RequestHandler?類可以在微信的文檔中找到.還有相關(guān)工具類
reqHandler.init();
//?執(zhí)行統(tǒng)一下單接口?獲得預(yù)支付id,一下是必填參數(shù)
//?微信分配的公眾賬號ID(企業(yè)號corpid即為此appId)
reqHandler.setParameter("appid",?WxPayConfig.APP_ID);?
//?微信支付分配的商戶號
reqHandler.setParameter("mch_id",?WxPayConfig.MCH_ID);?
//?終端設(shè)備號(門店號或收銀設(shè)備ID),注意:PC網(wǎng)頁或公眾號內(nèi)支付請傳"WEB"
reqHandler.setParameter("device_info",?"WEB");?
//?隨機(jī)字符串,不長于32位。推薦隨機(jī)數(shù)生成算法
reqHandler.setParameter("nonce_str",?noncestr);?
//?商品描述
reqHandler.setParameter("body",?body);?
//?商家訂單號
reqHandler.setParameter("out_trade_no",?out_trade_no);?
//?商品金額,以分為單位
reqHandler.setParameter("total_fee",?order_price);?
//?APP和網(wǎng)頁支付提交用戶端ip,Native支付填調(diào)用微信支付API的機(jī)器IP。
reqHandler.setParameter("spbill_create_ip",?"123.57.58.123");?
//?下面的notify_url是用戶支付成功后為微信調(diào)用的action?異步回調(diào).
reqHandler.setParameter("notify_url",?WxPayConfig.NOTIFY_URL);
//?交易類型,取值如下:JSAPI,NATIVE,APP,詳細(xì)說明見參數(shù)規(guī)定
reqHandler.setParameter("trade_type",?"JSAPI");
//?------------需要進(jìn)行用戶授權(quán)獲取用戶openid-------------
reqHandler.setParameter("openid",?openid);?//?這個必填.
/*
*?xmlappidwx2421b1c4370ec43b/appidattach支付測試/attachbody
*?JSAPI支付測試/bodymch_id10000100/mch_idnonce_str
*?1add1a30ac87aa2db72f57a2375d8fec/nonce_strnotify_url.
*?weixin.qq.com/pub_v2/pay/notify.v2.php/notify_urlopenid
*?oUpF8uMuAJO_M2pxb1Q9zNjWeS6o/openidout_trade_no1415659990/
*?out_trade_nospbill_create_ip14.23.150.211/spbill_create_ip
*?total_fee1/total_feetrade_typeJSAPI/trade_typesign
*?0CB01533B8C1EF103065174F50BCA001/sign/xml
*/
//?生成簽名,并且轉(zhuǎn)為xml
String?requestXml?=?reqHandler.getRequestXml();
System.out.println("requestXml:"?+?requestXml);
//?得到的預(yù)支付id
String?prepay_id?=?ServiceUtil.unifiedorder(requestXml);
SortedMapString,?String?params?=?new?TreeMapString,?String();
params.put("appId",?WxPayConfig.APP_ID);
params.put("timeStamp",?timestamp);
params.put("nonceStr",?noncestr);
params.put("package",?"prepay_id="?+?prepay_id);
params.put("signType",?"MD5");
System.out.println("params:"?+?JSONObject.fromObject(params).toString());
//?生成支付簽名,這個簽名?給?微信支付的調(diào)用使用
SortedMapObject,Object?signMap?=?new?TreeMapObject,Object();
signMap.put("appId",?WxPayConfig.APP_ID);?
signMap.put("timeStamp",?timestamp);
signMap.put("nonceStr",?noncestr);
signMap.put("package",?"prepay_id="?+?prepay_id);
signMap.put("signType",?"MD5");
//?微信支付簽名
String?paySign?=?MD5Util.createSign(signMap,?WxPayConfig.KEY);
System.out.println("PaySIGN:"?+?paySign);
//微信分配的公眾賬號ID(企業(yè)號corpid即為此appId)
request.setAttribute("appId",?WxPayConfig.APP_ID);
//?時間戳
request.setAttribute("timeStamp",?timestamp);?
//?隨機(jī)字符串
request.setAttribute("nonceStr",?noncestr);?
//?預(yù)支付id?,就這樣的格式
request.setAttribute("package",?"prepay_id="?+?prepay_id);
//?加密格式
request.setAttribute("signType",?WxPayConfig.SIGN_TYPE);?
//?微信支付簽名
request.setAttribute("paySign",?paySign);
return?"pay";
}
/**
*?異步返回
*/
@RequestMapping("notify")
public?String?notify(HttpServletRequest?request,?HttpServletResponse?response)?{
try?{
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);
}
outSteam.close();
inStream.close();
String?resultStr?=?new?String(outSteam.toByteArray(),?WxPayConfig.CHARTSET);
MapString,?String?resultMap?=?XMLUtil.doXMLParse(resultStr);
System.out.println("微信回調(diào)結(jié)果:"?+?resultMap.toString());
String?result_code?=?resultMap.get("result_code");
String?is_subscribe?=?resultMap.get("is_subscribe");
String?out_trade_no?=?resultMap.get("out_trade_no");
String?transaction_id?=?resultMap.get("transaction_id");
String?sign?=?resultMap.get("sign");
String?time_end?=?resultMap.get("time_end");
String?bank_type?=?resultMap.get("bank_type");
String?return_code?=?resultMap.get("return_code");
//?簽名驗(yàn)證
//??????????GenericValue?userLogin?=?delegator.findOne("UserLogin",?UtilMisc.toMap("userLoginId",?"admin"),?false);
if?(return_code.equals("SUCCESS"))?{
//?此處就是你的邏輯代碼
//?修改數(shù)據(jù)庫支付狀態(tài)
}
request.setAttribute("out_trade_no",?out_trade_no);
//?通知微信.異步確認(rèn)成功.必寫.不然會一直通知后臺.八次之后就認(rèn)為交易失敗了.
response.getWriter().write(RequestHandler.setXML("SUCCESS",?""));
}?catch?(UnsupportedEncodingException?e)?{
e.printStackTrace();
}?catch?(IOException?e)?{
e.printStackTrace();
}?catch?(JDOMException?e)?{
e.printStackTrace();
}
return?"notify";
}
}
微信掃碼支付,有兩種模式,文檔中有介紹。第二種模式,微信接口會返回二維碼信息給我們。而第一種模式則需要我們自己去生成二維碼信息。會有些麻煩。尤其 是參數(shù)大小寫,還有簽名的問題,容易出錯。
總的來說第二種模式比第一種模式簡單。所有我采用的是第二種模式,比較通用。京東與攜程亦用的是第二種模式。
新聞名稱:java微信掃碼支付代碼,h5掃碼微信支付寶支付
地址分享:http://vcdvsql.cn/article14/heojge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)、定制網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)