เมื่อเร็ว ๆ นี้การพัฒนาบัญชีสาธารณะของ WeChat ได้รับการสำรวจเป็นเวลาสองสามวันเพราะได้ทำเป็นครั้งแรกและมันก็ถึงระดับของฟังก์ชั่นการใช้งานเท่านั้น
การชำระเงินโดยรวมของบัญชีสาธารณะ WeChat นั้นง่ายมากและแบ่งออกเป็นสามขั้นตอน ขั้นตอนแรกจะต้องได้รับจากการอนุญาตของผู้ใช้; ต่อไปนี้แนะนำกระบวนการพัฒนาของแต่ละขั้นตอน
ก่อนอื่นจำเป็นต้องชี้แจงว่าการชำระเงินของบัญชีสาธารณะ WeChat เป็นการชำระเงินเวอร์ชันเว็บดังนั้นจึงจำเป็นที่จะต้องได้รับอนุญาต WECHAT ขั้นตอนหนึ่งขั้นตอนมากกว่าแอพที่ดึงการชำระเงิน WECHAT โดยตรง นั่นคือคุณต้องได้รับ OpenID ของผู้ใช้ ประเภทของธุรกรรมที่ใช้โดยบัญชีสาธารณะ WeChat คือ JSAPI ดังนั้นเอกสารของอินเทอร์เฟซคำสั่งซื้อแบบครบวงจรจึงถูกเขียนไว้อย่างชัดเจน
ดังนั้นเราต้องได้รับ OpenID และในเวลาเดียวกันเราสามารถจัดการตรรกะที่เราต้องการได้ มีสองวิธีในการขออนุญาตผู้ใช้: 1.Scope = SNSAPI_BASE;
ขอบเขตคือ snsapi_base
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&rdirect_uri=http%2fchong.qq.com%2FPHPPHP%2FINDEX.PHP%3FD%26 หัวข้อ% 3D1%26VB2CTAG%3D4_2030_5_1194_60 & response_type = รหัส & scope = snsapi_base & state = 123#wechat_redirect
ขอบเขตคือ snsapi_userinfo
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3a% 2F%2fnba.bluewebgame.com #wechat_redirect
เอกสารอย่างเป็นทางการของ WeChat ยังมีคำอธิบายโดยละเอียดของแต่ละพารามิเตอร์และฉันจะอธิบายพารามิเตอร์สำคัญอย่างระมัดระวัง ก่อนอื่น Appid ไม่มากที่จะบอกว่าบัญชีสาธารณะของ WeChat ของคุณได้รับการแก้ไขถึงความตาย คุณสามารถเย็บพารามิเตอร์ที่คุณต้องการในลิงค์นี้ พารามิเตอร์ของรัฐสามารถเข้าใจได้ว่าเป็นฟิลด์ขยาย ต่อไปนี้เป็นคลิปรหัสของ OpenID
// รับ httpclientutil util = httpClientutil.getInstance (); , wxpayconfig.appsecret); map.put ("รหัส", รหัส); /sns/oauth2/access_token ", null, map); logger.info (" returnstr: [" + returnstr +"] "); accessStoken at = json.parseObject (returnstr, accessstoken.c lass);accesstoken.java
Public Accessstoken {String ส่วนตัว Access_token; return expires_in;} โมฆะสาธารณะ setExpires_in (สตริง expires_in) {this.expires_in = expires_in; openId;} โมฆะสาธารณะ setOpenid (สตริง openId) {this.openid = openId;} สตริงสาธารณะ e () {return scope;} โมฆะสาธารณะ setScope (ขอบเขตสตริง) {this.scope = scope;} public String getunionid () {return UnionId;} โมฆะสาธารณะ setunionid (String UnionId) {this.unionid = unionId; openId = " + openId +", scope = " + scope +", unionId = " + unionId +"] "]"] "ประการที่สองหลังจากที่เราได้รับ OpenID เราสามารถดำเนินการตามคำสั่งซื้อแบบครบวงจรต่อไป เอกสารของอินเทอร์เฟซเดียวบน WeChat นั้นมีรายละเอียดมากขึ้นและฉันจะไม่แนะนำความหมายของพารามิเตอร์เฉพาะ รหัสที่ใช้งานง่ายที่สุดโพสต์ด้านล่างโดยเฉพาะอย่างยิ่งการเตือนว่าคุณต้องใส่ใจกับลายเซ็นที่ถูกต้อง คีย์ที่ใช้ในลายเซ็นไม่ใช่แอพพลิเคชั่น แต่คีย์ผู้ค้าที่คุณกำหนดเมื่อคุณสมัคร
// คำสั่งซื้อ wxpaysenddata data = new wxpaysenddata (); data.setnonce_str (noncestr); IP); นามแฝง ("xml", wxpayreturndata.class);UnifiedorderService.java
Public Class UnifiedOrderservice {Private Final Static Logger = LoggerFactory.getLogger (Unifiedornderservice.class); วัตถุ, พารามิเตอร์> new TreeMap <Object, Object> (); ; . getOut_trade_no ()); พารามิเตอร์. บราพ์ ("total_fee", data.getTotal_fee eters.put ("trade_type", data.gettrade_type ()); ", data.getOpenid ()); parameters.put (" device_info ", d ata.getDevice_Info ()); logger.info (" Sign: "+WxSign.Createsign (พารามิเตอร์, คีย์)); f-8", ใหม่ XmlfriendlyNameCoder ("- _", "_")); XML); " + returnxml);} catch (Exception e) {e.printstacktrace ();} returnxml;}}}}}}}}}}WxSign
คลาสสาธารณะ WXSIGN {Private String starenterEncoding = "UTF-8"; พารามิเตอร์. entryset (); มัน {sb.append (k + "=" + v + "&");}} sb.append ("key =" + คีย์); ); สัญญาณส่งคืน;} สตริงคงที่ getNOSTR () {สุ่ม = ใหม่สุ่ม (); {return string.valueof (system.currentttimemillis () / 1000);}}สิ่งสุดท้ายที่กล่าวถึงคือที่อยู่การโทรกลับ NOTEFY_URL เพื่อรับการชำระเงินแบบอะซิงโครนัส
เราได้รับการเตรียมการเตรียมธุรกรรมก่อนการชำระเงินเพื่อให้เราสามารถดำเนินการขั้นตอนสุดท้าย ใช้ H5 เพื่อปรับ API การชำระเงิน
// h5 เปิด attr.addattribute ("appid", redata.getappid ()); ; "Appid", Redata.getAppid ()); ); ", wxSign.createSign (SignMap, WxPayConfig.key));หลังจากผ่านพารามิเตอร์ที่ต้องการไปยังหน้าแล้วให้ใช้ WeChat เพื่อให้วิธีการตั้งค่าการชำระเงิน
<script> ฟังก์ชั่น geturlparam (ชื่อ) {// สร้างวัตถุนิพจน์ทั่วไปที่มีพารามิเตอร์เป้าหมาย var reg = new regexp ("(^| &)" + ชื่อ + "= ([^&]*) (& | $)) "); // จับคู่พารามิเตอร์เป้าหมาย var r = window.location.search.Substr (1) .match (reg); // ส่งคืนค่าพารามิเตอร์ถ้า (r! = null) ส่งคืน Unescape (r [2]); null;} ฟังก์ชั่น onbridgeready () {var appid = geturlparam ('appid'); 'SignType'); Timestamp, // "1395712654", // Timelia, หมายเลขที่สองของวินาทีตั้งแต่ปี 1970 "noncestr": noncestr, // "e61463f8efa94090B1F366CCCFBBBB44444" ": SignType, //" md5 ", // วิธีลายเซ็น WeChat:" paysign ": paysign, //" 70ea570631e4bb79628fbca905343ffadd89 " ย้อนกลับไปทีม WeChat เตือนอย่างจริงจัง: Res.err_MSG จะกลับไปที่ OK หลังจากผู้ใช้จ่ายสำเร็จ แต่ไม่รับประกันว่าจะเชื่อถือได้อย่างแน่นอน get_brand_wcpay_request: ยกเลิก ") {แจ้งเตือน (" การยกเลิกธุรกรรม ");} ถ้า (res.err_msg ==" get_wcpay_request: ล้มเหลว ") lert (" การชำระเงินล้มเหลว ");}}); == "underfined") {ถ้า (document.addeventristener) {document.addeventListener ('wei xinjsbridgeready', onbridgeready, false); AttachEvent ('onweixinjsbridgeready', onbridgeready);}} else {onbridgeReady ();}} </script>คุณสามารถปรับแต่งหน้าคืนของคุณเองซึ่งคุณส่งคืนผลลัพธ์
สรุป: เนื่องจากฉันทำมันเป็นครั้งแรกการเขียนบทความนี้คือการบันทึกผลการทำงานของฉันและเพื่อน ๆ ที่แบ่งปันกับมือใหม่สามารถได้รับความช่วยเหลือในที่สุด ความคืบหน้า.
ข้างต้นคือเนื้อหาทั้งหมดของการพัฒนาของ WeChat Public Payment ของ Java ฉันหวังว่าทุกคนจะชอบ