java開辟微信"號付出。本站提示廣大學習愛好者:(java開辟微信"號付出)文章只能為提供參考,不一定能成為您想要的結果。以下是java開辟微信"號付出正文
比來做了微信"號付出的開辟,因為是第一次做也探索了幾天的時光,也只是到達了完成功效的程度,並沒有太多斟酌到機能成績,所以這篇文章比擬合適初學者。
微信"號付出的整體其實很簡略,年夜致就分為三步。第一步須要獲得用戶受權;第二步驟用同一下單接口獲得預付付id;第三步H5調起微信付出的內置的js。上面引見詳細每步的開辟流程。
一 起首要明白微信"號付出屬於網頁版付出,所以相較於app的直接調取微信付出要多一步微信受權。也就是須要獲得用戶的openid。微信"號應用的生意業務類型是JSAPI,所以同一下單接口的文檔明白的寫到
是以我們必需去獲得openid,同時也能夠處置一些我們須要的邏輯。獲得用戶受權有兩種方法:1.scope=snsapi_base;2.scope=snsapi_userinfo.我應用的是snsapi_base
Scope為snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=http%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirect
Scope為snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
微信的官方文檔也有對各個參數的具體解釋,我就症結的參數細心的解釋一下。起首appid就不多說了就是你微信"號的appid固定寫逝世的,redirect_uri這個參數是最主要的,這個地址是拜訪你處置的接口地址。你可以在這個鏈接上拼接上你所須要的參數,普通你是要把定單的金額傳到這個接口裡的,拜訪這個鏈接的時刻微信會給你code你須要用它去獲得openid,記得要對其停止urlencode處置。state參數可以懂得為擴大字段,其他的參數都是固定寫法就不在多做引見了。上面是獲得openid的代碼片斷。
//獲得openId
HttpClientUtil util = HttpClientUtil.getInstance();
Map<String, String> map = new HashMap<String, String>();
map.put("appid", WxPayConfig.APPID);
map.put("secret", WxPayConfig.APPSECRET);
map.put("code", code);
map.put("grant_type", WxPayConfig.GRANT_TYPE);
String returnStr = util.doPostRetString("https://api.weixin.qq.com/sns/oauth2/access_token", null,map);
logger.info("returnStr:[" + returnStr + "]");
AccessToken at = JSON.parseObject(returnStr, AccessToken.class);
AccessToken.java
public class AccessToken {
private String access_token;
private String expires_in;
private String refresh_token;
private String openid;
private String scope;
private String unionid;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getExpires_in() {
return expires_in;
}
public void setExpires_in(String expires_in) {
this.expires_in = expires_in;
}
public String getRefresh_token() {
return refresh_token;
}
public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
@Override
public String toString() {
return "AccessToken [access_token=" + access_token + ", expires_in="
+ expires_in + ", refresh_token=" + refresh_token + ", openid="
+ openid + ", scope=" + scope + ", unionid=" + unionid + "]";
}
}
二 我們獲得了openid後,便可以停止下一步的同一下單的開辟了。微信上同一下單接口的文檔寫的比擬具體了,詳細的參數寄義我就不多做引見了。上面直接貼最直不雅的代碼,特殊提示的是必定要留意簽名的准確。簽名所應用的key其實不是AppSecret而是你請求時本身界說的商戶key。
//同一下單
WxPaySendData data = new WxPaySendData();
data.setAppid(WxPayConfig.APPID);
data.setAttach("微信付出");
data.setBody("微信"號付出");
data.setMch_id(WxPayConfig.MCHID);
data.setNonce_str(nonceStr);
data.setNotify_url(WxPayConfig.NOTIFY_URL);
data.setOut_trade_no(tradeNo);
data.setTotal_fee((int)(fee*100));//單元:分
data.setTrade_type("JSAPI");
data.setSpbill_create_ip(ip);
data.setOpenid(at.getOpenid());
String returnXml = UnifiedorderService.unifiedOrder(data,WxPayConfig.KEY);
WxPayReturnData reData = new WxPayReturnData();
XStream xs1 = new XStream(new DomDriver());
xs1.alias("xml", WxPayReturnData.class);
reData = (WxPayReturnData) xs1.fromXML(returnXml);
UnifiedorderService.java
public class UnifiedorderService {
private final static Logger logger = LoggerFactory.getLogger(UnifiedorderService.class);
public static String unifiedOrder(WxPaySendData data,String key){
//同一下單付出
String returnXml = null;
try {
//生成sign簽名
SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
parameters.put("appid", data.getAppid());
parameters.put("attach", data.getAttach());
parameters.put("body", data.getBody());
parameters.put("mch_id", data.getMch_id());
parameters.put("nonce_str", data.getNonce_str());
parameters.put("notify_url", data.getNotify_url());
parameters.put("out_trade_no", data.getOut_trade_no());
parameters.put("total_fee", data.getTotal_fee());
parameters.put("trade_type", data.getTrade_type());
parameters.put("spbill_create_ip", data.getSpbill_create_ip());
parameters.put("openid", data.getOpenid());
parameters.put("device_info", data.getDevice_info());
logger.info("SIGN:"+WxSign.createSign(parameters,key));
data.setSign(WxSign.createSign(parameters,key));
XStream xs = new XStream(new DomDriver("UTF-8",new XmlFriendlyNameCoder("-_", "_")));
xs.alias("xml", WxPaySendData.class);
String xml = xs.toXML(data);
logger.info("同一下單xml為:\n" + xml);
HttpClientUtil util = HttpClientUtil.getInstance();
returnXml = util.doPostForString("https://api.mch.weixin.qq.com/pay/unifiedorder", null, xml);
logger.info("前往成果:" + returnXml);
} catch (Exception e) {
e.printStackTrace();
}
return returnXml;
}
}
WxSign
public class WxSign {
private static String characterEncoding = "UTF-8";
@SuppressWarnings("rawtypes")
public static String createSign(SortedMap<Object,Object> parameters,String key){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//一切介入傳參的參數依照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + key);
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
public static String getNonceStr() {
Random random = new Random();
return MD5Util.MD5Encode(String.valueOf(random.nextInt(10000)), "UTF-8");
}
public static String getTimeStamp() {
return String.valueOf(System.currentTimeMillis() / 1000);
}
}
最初要提一下的是NOTIFY_URL回調地址,吸收微信付出異步告訴回調地址。
三 經由過程下面的操作我們取得了預付付生意業務會話標識prepay_id,如許我們便可以停止最初一步的操作了。應用H5調起付出api。
//H5調起付出
attr.addAttribute("appId", reData.getAppid());
attr.addAttribute("timeStamp", WxSign.getTimeStamp());
attr.addAttribute("nonceStr", reData.getNonce_str());
attr.addAttribute("package", "prepay_id="+reData.getPrepay_id());
attr.addAttribute("signType", "MD5");
SortedMap<Object,Object> signMap = new TreeMap<Object,Object>();
signMap.put("appId", reData.getAppid());
signMap.put("timeStamp", WxSign.getTimeStamp());
signMap.put("nonceStr", reData.getNonce_str());
signMap.put("package", "prepay_id="+reData.getPrepay_id());
signMap.put("signType", "MD5");
logger.info("PaySIGN:"+WxSign.createSign(signMap,WxPayConfig.KEY));
attr.addAttribute("paySign", WxSign.createSign(signMap,WxPayConfig.KEY));
將須要的參數傳給頁面後,應用微信供給辦法調起付出。
<script>
function getUrlParam(name) {
//結構一個含有目的參數的正則表達式對象
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
//婚配目的參數
var r = window.location.search.substr(1).match(reg);
//前往參數值
if (r != null)
return unescape(r[2]);
return null;
}
function onBridgeReady() {
var appId = getUrlParam('appId');
var timeStamp = getUrlParam('timeStamp');
var nonceStr = getUrlParam('nonceStr');
var Package = getUrlParam('package');
var signType = getUrlParam('signType');
var paySign = getUrlParam('paySign');
WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId" : appId,//"wx2421b1c4370ec43b", //"號稱號,由商戶傳入
"timeStamp" : timeStamp,//"1395712654", //時光戳,自1970年以來的秒數
"nonceStr" : nonceStr,//"e61463f8efa94090b1f366cccfbbb444", //隨機串
"package" : Package,//"prepay_id=u802345jgfjsdfgsdg888",
"signType" : signType,//"MD5", //微信簽名方法:
"paySign" : paySign,//"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信簽名
}, function(res) { // 應用以上方法斷定前端前往,微信團隊慎重提醒:res.err_msg將在用戶付出勝利後前往 ok,但其實不包管它相對靠得住。
//alert(res.err_msg);
if (res.err_msg == "get_brand_wcpay_request:ok") {
alert("付出勝利");
}
if (res.err_msg == "get_brand_wcpay_request:cancel") {
alert("生意業務撤消");
}
if (res.err_msg == "get_brand_wcpay_request:fail") {
alert("付出掉敗");
}
});
}
function callPay() {
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady,
false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
} else {
onBridgeReady();
}
}
</script>
在前往成果的處所可以自界說一些本身的前往頁面。
總結:因為我也是第一次做,寫這篇文章是想記載一下本身的任務結果,和分享給一下也是老手的同伙們可以有一些贊助,最初願望有好的看法同伙可以留言評論辯論,年夜家一路進修提高。
以上就是關於java開辟微信"付出的一切內容了,願望年夜家可以或許愛好。