微信公眾號支付demo,微信公眾號支付Java DEMO
微信支付真是一堆坑. 居然官網(wǎng)都沒有java版本的完整代碼,微信公眾號支付demo,微信公眾號支付Java DEMO.
1. 系統(tǒng)調(diào)試環(huán)境配置:
1.1 配置動態(tài)域名:
使用ngrok配置環(huán)境;配置ngrok.cfg內(nèi)容如下:
server_addr: "tunnel.mobi:44433"
trust_host_root_certs: true
1.2 啟動ngrok,windows下用cmd
>cd ngrok
>ngrok -config ngrok.cfg-subdomain hc 80
啟動后訪問地址為hc.tunnel.mobi
1.3 修改sts的tomcat的端口為80
微信支付只訪問80端口。
Configure.java文件中配置信息:
1.4獲取微信的關(guān)鍵配置參數(shù)詳解
1.4.1.appid 微信公眾平臺-開發(fā)者中心-配置項-開發(fā)者ID
1.4.2.appSecret
1.4.3.微信支付商戶號mchid=1267692501
微信支付、商戶平臺—賬戶信息--基本賬戶信息
1.4.4 subMchID受理模式下給予商戶分配的子商戶號,默認(rèn)可填””
1.4.5. key
位置:微信支付、商戶平臺—賬戶設(shè)置—API安全—API密鑰
輸入一個32位的字母數(shù)字組成的字符串。
1.4.6 certLocalPath
位置:微信支付、商戶平臺—賬戶設(shè)置—API安全—API證書
certLocalPath=”絕對路徑下的apiclient_cert.p12”
下載后的*.p12文件需要windows上可以直接雙擊導(dǎo)入系統(tǒng),導(dǎo)入過程中會提示輸入證書密碼,證書密碼默認(rèn)為您的商戶ID(mchID)
證書的導(dǎo)入:
微信支付接口中,涉及資金回滾的接口會使用到商戶證書,包括退款、撤銷接口。商家在申請微信支付成功后,收到的相應(yīng)郵件后,可以按照指引下載API證書,也可以按照以下路徑下載:
微信商戶平臺(pay.weixin.qq.com)-->賬戶設(shè)置-->API安全-->證書下載 。證書文件有四個,
apiclient_cert.p12是商戶證書文件,除PHP外的開發(fā)均使用此證書文件。
雙擊apiclient_cert.p12文件,
windows上可以直接雙擊導(dǎo)入系統(tǒng),導(dǎo)入過程中會提示輸入證書密碼,證書密碼默認(rèn)為您的商戶ID(如:1267692501)
1.4.7 certPassword=mchID
也可以在上面的導(dǎo)入p12的文件時,重新設(shè)置密碼,注意此處的密碼不能為空,因為空密碼會報錯。
1.4.8 notifyCallbackUrl
默認(rèn)回調(diào)地址預(yù)訂單生成完成后的回調(diào)地址.
notifyCallbackUrl=http://hc.tunnel.mobi/shopapi/weixin/authorize/UnifiedorderCallBack
1.5配置用戶消息,和開發(fā)者需要的事件推送。
1.5.1在微信開發(fā)者mp.weixin.qq.com,找到開發(fā)者中心—配置項—服務(wù)器配置
1.5.2開發(fā)賬號里面找到。
開發(fā)者中心,在這里再找“網(wǎng)頁賬號”修改hc.tunnel.mobi
服務(wù)器配置中,URL(服務(wù)器地址)修改為http://hc.tunnel.mobi/shopapi/weixin/verify
Token(令牌)為:weixinCourse
1.5.3開發(fā)者中心—配置項中查找網(wǎng)頁賬號 設(shè)置對應(yīng)的回調(diào)地址:
1.5.4微信驗證的控制方法:
/**
* 微信驗證
* 請?zhí)顚懡涌谂渲眯畔ⅲ诵畔⑿枰阌凶约旱姆?wù)器資源,填寫的URL需要正確響應(yīng)微信發(fā)送的Token驗證
* 驗證服務(wù)器地址的有效性
* 開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請求到填寫的服務(wù)器地址URL上,GET請求攜帶四個參數(shù):
* 參數(shù) 描述
* signature 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。
* timestamp 時間戳
* nonce 隨機(jī)數(shù)
* echostr 隨機(jī)字符串
* @return
* @throwsIOException
*/
@RequestMapping(value = "/weixin/verify",method = RequestMethod.GET)
public voidweixinVerify(Model model, WeixinVerifyDto verify, HttpServletResponse response)throwsIOException{
PrintWriter out = response.getWriter();
if (SignUtil.checkSignature(verify.getSignature(), verify.getTimestamp(),verify.getNonce())) {
model.addAttribute("echoStr", verify.getEchostr());
out.print(verify.getEchostr());
}
//return "verify";
out.close();
out = null;
}
SignUtil
import java.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class SignUtil {
// 與接口配置信息中的Token要一致
private static String token = "weixinCourse";
/**
* 驗證簽名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp,
String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null;
try {
md =MessageDigest.getInstance("SHA-1");
// 將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
// 將sha1加密后的字符串可與signature對比,標(biāo)識該請求來源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
* 將字節(jié)數(shù)組轉(zhuǎn)換為十六進(jìn)制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
}
/**
* 將字節(jié)轉(zhuǎn)換為十六進(jìn)制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
}
WeixinVerifyDto
/**
* 開發(fā)者提交信息后,微信服務(wù)器將發(fā)送GET請求到填寫的服務(wù)器地址URL上,GET請求攜帶四個參數(shù):
* 開發(fā)者通過檢驗signature對請求進(jìn)行校驗(下面有校驗方式)。若確認(rèn)此次GET請求來自微信服務(wù)器,請原樣返回echostr參數(shù)內(nèi)容,則接入生效,成為開發(fā)者成功,否則接入失敗。
* 加密/校驗流程如下:
* 1. 將token、timestamp、nonce三個參數(shù)進(jìn)行字典序排序
* 2. 將三個參數(shù)字符串拼接成一個字符串進(jìn)行sha1加密
* 3. 開發(fā)者獲得加密后的字符串可與signature對比,標(biāo)識該請求來源于微信
* @author HuangC
*
*/
public classWeixinVerifyDto {
/**
* 微信加密簽名,signature結(jié)合了開發(fā)者填寫的token參數(shù)和請求中的timestamp參數(shù)、nonce參數(shù)。
*/
privateString signature;
/**
* 時間戳
*/
privateString timestamp;
/**
* 隨機(jī)數(shù)
*/
privateString nonce;
/**
* 隨機(jī)字符串
*/
privateString echostr;
publicString getSignature() {
return signature;
}
publicvoidsetSignature(String signature){
this.signature = signature;
}
publicString getTimestamp() {
return timestamp;
}
publicvoidsetTimestamp(String timestamp){
this.timestamp = timestamp;
}
publicString getNonce() {
return nonce;
}
publicvoidsetNonce(String nonce){
this.nonce = nonce;
}
publicString getEchostr() {
return echostr;
}
publicvoidsetEchostr(String echostr){
this.echostr = echostr;
}
}
2.測試:
找到PayUtils這個文件。增加下面的代碼:
publicstaticvoidmain(String[] args){
PayPackage payPackage = new PayPackage();
PayQrCode qrCode = new PayQrCode("3214123423");
payPackage.setAppid(Configure.getAppid());
payPackage.setAttach("test");
payPackage.setBody("JSAPI測試支付");
payPackage.setNonce_str(qrCode.getNonce_str());
payPackage.setMch_id(qrCode.getMch_id());
payPackage.setOpenid("o0IrGwYeRrTbko6LlV0rOoanJHbc");
payPackage.setOut_trade_no(UUID.randomUUID().toString().replace("-", ""));
payPackage.setProduct_id(qrCode.getProduct_id());
payPackage.setSpbill_create_ip("14.23.150.211");
payPackage.setTotal_fee("1");
payPackage.setTrade_type("JSAPI");
String replyXml = PayUtils.generatePayNativeReplyXML(payPackage);
}
如果順利的話就能獲取下面的xml格式的String
以上就是微信公眾號支付demo的內(nèi)容,更多更熱門的微信公眾號素材,歡迎瀏覽Hi商學(xué)院網(wǎng)站。