JAVA 백엔드 통합 코드 스캔 결제: 위챗 페이지

9093 단어 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 {

   }
  }
 ); 

이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.

좋은 웹페이지 즐겨찾기