JAVA 백엔드 통합 코드 스캔 결제: 위챗 페이지
돈 받는 것처럼 코드를 통일해서 돈을 받을 수 있는 기능을 하세요.
처음에는 어떻게 이루어졌는지 몰랐고 여러 친구에게 문의를 해서 대략적인 업무 절차를 알게 되었다. 먼저 웹 페이지를 열어 결제 플랫폼, 위챗인지 알리페이인지 판단하고 나서 처리하기 쉽다. 위챗페이와 알리페이의 공식 문서를 그대로 옮긴다.하지만 위챗의 문서는 좀 혼란스러워서 신경을 많이 써야 한다.
지금 어떻게 위챗페이 웹 결제, 즉 공중번호 결제를 실현할 수 있는지 이야기합니다.
1. 결제 플랫폼을 판단하고 위챗 플랫폼이라고 판단할 때 반드시 윈도우를 사용해야 한다.위치는 웹 페이지를 열 수 있습니다. 다른 방법으로 IOS 버전 위챗에서는 웹 페이지를 열 수 없습니다. 적어도 현재의 새 버전 위챗은 열 수 없습니다.대응하는 연결은 코드의 링크를 요청하는 것입니다.두 번째 단계는 말할 것이다.
<html>
<head>
<title> </title>
<basefont face=" " size="2" />
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<meta name="exporter-version" content="Evernote Windows/303244 (zh-CN, DDL); Windows/6.1.7601 Service Pack 1 (Win64);"/>
<script type="text/javascript" src="jquery-3.1.1.min.js"></script>
<style>
body, td {
font-family: ;
font-size: 10pt;
}
</style>
</head>
<body>
<script type="text/javascript">
window.onload = function(){
if(isWeiXin()){
window.location='http://www.xxoo.com/InterfaceAPI/code';
} else if(isZFB()){
alert(' ....');
//var p = document.getElementsByTagName('p');
//p[0].innerHTML = window.navigator.userAgent;
}else{
alert(' App ');
}
}
function isWeiXin(){
var ua = window.navigator.userAgent.toLowerCase();
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
return true;
}else{
return false;
}
}
function isZFB(){
var ua = window.navigator.userAgent.toLowerCase();
if(ua.match(/AlipayClient/i) =='alipayclient'){
return true;
}else{
return false;
}
}
</script>
</body></html>
2. 여기는 코드를 가져옵니다. 리셋 주소는 URLEncoder의 utf-8 인코딩을 사용해야 합니다. 여기는 최종적으로openid만 가져옵니다. UserInfo의 다른 정보를 가져오는 자체 테스트가 필요합니다. scope의 매개 변수만 수정하면 됩니다.
@RequestMapping({ "code" })
public void getCode(HttpServletRequest request, HttpServletResponse response) {
try {
//
String redirect_uri = URLEncoder.encode(
"http://www.xxoo.com/InterfaceAPI/openid?codeID=7837283",
"utf-8");
String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="
+ WechatConfig.APP_ID
+ "&redirect_uri="
+ redirect_uri
+ "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
response.sendRedirect(url);
} catch (Exception e) {
e.printStackTrace();
}
}
3. 코드id 매개 변수가 있습니다. 신경 쓰지 마세요. 테스트용으로 사용됩니다.여기는openid만 필요합니다. 다음은 get 방법으로 json의 결과를 가져와openid를 가져온 후 결제 페이지로 다시 지정합니다.
@RequestMapping({ "openid" })
public void getOpenid(String codeID, String code,
HttpServletResponse response) {
try {
String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ WechatConfig.APP_ID
+ "&secret="
+ WechatConfig.APP_SECRET
+ "&code="
+ code
+ "&grant_type=authorization_code";
if (code != null) {
String json = WebUtils.get(requestUrl, null);
WechatResult result = new Gson().fromJson(json,
WechatResult.class);
OPEN_ID = result.getOpenid();
System.out.println("====OPEN_ID====" + OPEN_ID);
response.sendRedirect("http://www.xxoo.com/InterfaceAPI/pay.html");
}
} catch (Exception e) {
e.printStackTrace();
}
}
4. 프런트엔드 결제 페이지에서 지불할 금액을 입력하여 백그라운드에 제출
$.ajax({
type: "POST",
dataType: "html",
url: "http://www.xxoo.com/InterfaceAPI/weixinPay",
data: "value="+self.input.value,
timeout:10000,
cache: true,
async: true,
error: function(data){
//alert(data+"---value-->"+self.input.value);
}, },});
5. 백엔드에서 금액을 얻고 백엔드에서 통일적으로 주문한다. 공중번호 지불은 두 가지가 다르다. 첫째, 지불 유형을 JSAPI로 바꾸고, 둘째, Openid를 받아야 한다.
@RequestMapping({ "weixinPay" })
public void weixinPay(HttpServletRequest request,
HttpServletResponse response) {
String value = request.getParameter("value");
WechatTradeTest wechat = new WechatTradeTest();
String json = wechat.testunifiedOrder(Integer.valueOf(value), OPEN_ID);
// json
write(json, response);
}
6. 통합 주문에 성공하고 돌아온 결과의 예:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wx2421b1c4370ec43b]]></appid>
<mch_id><![CDATA[10000100]]></mch_id>
<nonce_str><![CDATA[IITRi8Iabbblz1Jc]]></nonce_str>
<openid><![CDATA[oUpF8uMuAJO_M2pxb1Q9zNjWeS6o]]></openid>
<sign><![CDATA[7921E432F65EB8ED0CE9755F0E86D72F]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201411101639507cbf6ffd8b0779950874]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
</xml>
7. 되돌아오는 매개 변수는 다시 서명하고 앞부분으로 되돌아와야 한다. 서명 방법은 통일적으로 주문할 때의 서명과 같다!서명할 때 반드시 위챗 상점을 데리고 돌아와야 한다.
public String testunifiedOrder(int fee,String openid) {
WechatUnifiedOrder request = new WechatUnifiedOrder();
request.setBody(" ");
request.setDetail(" ");
request.setGoods_tag(" ");
request.setOut_trade_no(System.currentTimeMillis() + "");
request.setFee_type("CNY");
request.setTotal_fee(1);
request.setSpbill_create_ip("192.168.88.26");
request.setTime_start(System.currentTimeMillis() + "");
request.setOpenid(openid);
//
WechatUnifiedOrder.Response response = WechatConfig.getInstance()
.unifiedOrder(request);
response.setTime_start(request.getTime_start());
WeichatData data = new WeichatData();
data.setAppId(response.getAppid());
data.setTimeStamp(request.getTime_start());
data.setNonceStr(response.getNonce_str());
data.setPrepay_id(response.getPrepay_id());
data.setSignType("MD5");
TreeMap<String, String> requestMap = new TreeMap<String, String>();
requestMap.put("appId", response.getAppid());
requestMap.put("timeStamp", response.getTime_start());
requestMap.put("nonceStr", response.getNonce_str());
requestMap.put("package", "prepay_id="+response.getPrepay_id());
requestMap.put("signType","MD5");
data.setPaySign(sign(requestMap).toUpperCase());
return new Gson().toJson(data);
}
8.전단은 json을 분석하여 대응하는 값을 얻고 위챗 결제를 깨워야 합니다
success: function(data){
if(data!=null){
var obj=eval("("+data+")");
appId = obj["appId"];
//timeStamp = new Date().getTime();
timeStamp = obj["timeStamp"];
nonceStr = obj["nonceStr"];
package = obj["prepay_id"];
paySign = obj["paySign"];
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();
}
}else{
alert(" ");
}
},
//
function onBridgeReady(){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId" :appId,
"timeStamp":timeStamp,
"nonceStr" :nonceStr,
"package" :"prepay_id="+package,
"signType" :"MD5",
"paySign" : paySign
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {
}else {
}
}
);
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
38. Java의 Leetcode 솔루션텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.