整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          個人站點(diǎn)申請接入QQ登錄的一波三折

          ello呀,我是yangyang.在經(jīng)歷多次qq互聯(lián)創(chuàng)建網(wǎng)站應(yīng)用來接入qq快速登錄審核不過之后,內(nèi)心已經(jīng)難受至極,今天給大家分享下接入qq登錄的申請流程的一些細(xì)節(jié)之處,基本能保證大家通過.


          細(xì)節(jié)點(diǎn)

          1. 創(chuàng)建應(yīng)用填寫的信息最好和個人網(wǎng)站備案填寫的一致,尤其是備案號,比寫成備案服務(wù)號了
          2. 一定要在你的網(wǎng)站登錄、注冊頁面 加入 qq登錄的圖標(biāo)(具體官網(wǎng)有說明)


          如圖

          1. 一定一定要在上面的qq登錄圖標(biāo)上做接入代碼,如果你只是放了按鈕,沒有接入的話,結(jié)果也是審核不過(下面我給大家分享我拿到的一份代碼)
          
          <html>
          <head>
              <meta charset="UTF-8" />
              <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
              <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">
              <meta http-equiv="X-UA-Compatible" content="IE=edge">
              <title>互聯(lián)登錄的demo</title>
              <style>
                  html,body {
                      margin: 0;
                      padding: 0;
                      height: 100%;
                      width: 100%;
                  }
                  body {
                      font-family: sans-serif;
                      display: flex;
                      justify-content: center;
                      align-items: center;
                  }
                  button {
                      background-color: transparent;
                      width: 150px;
                      height: 44px;
                      border-radius: 32px;
                      border: 1px solid #999;
                      cursor: pointer;
                      font-family: inherit;
                  }
                  button:hover {
                      background-color: #3abcff;
                      border-color: #3abcff;
                      color: #fff;
                  }
                  button i {
                      display: inline-block;
                      vertical-align: middle;
                      width: 18px;
                      height: 18px;
                      -webkit-mask-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA+1pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNyAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMTYtMTItMjFUMTI6MzM6MjYrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDE4LTA5LTIxVDEwOjQ1OjQ2KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDE4LTA5LTIxVDEwOjQ1OjQ2KzA4OjAwIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjcxMzlDMDQwQkQ0ODExRTg4ODFGQTcwMkEwQTAyQTQ5IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjcxMzlDMDQxQkQ0ODExRTg4ODFGQTcwMkEwQTAyQTQ5IiBkYzpmb3JtYXQ9ImltYWdlL3BuZyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQ3RDU2OTAwQjU1QjExRTZCQTZEQUY4MDI2NTY4MUExIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQ3RDU2OTAxQjU1QjExRTZCQTZEQUY4MDI2NTY4MUExIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+kM01ZAAAA/5JREFUeNrcW01IFVEUvi9Ty8zMNAvJMNIMCZFEK108qFZqpFAQWdugRQVWCNW2TZs2rWonBG1EwaCfRYsWBUVQRGIRSUVZmf1ivbRe3+mdgcdrxLlzZ+478w58zGPmvfvu+eacc885cyeWTCaVicRiMS9fywOagFZgI7AGKAWWANPAZ+A1MArcY/z2MrDp/P8NYIJ5pB64AHygv9LAFHAR2BT6/EMioAYYBP5oKu6Gq8CGKBFwlM06GSASQD95nGQCCoDLASueCbKqIokEkPLXQlbewY10EqQQMGBJeQfDjjtIIOCwZeUdnAyCgJjJOoocYC0Oj4FiZV8oMDZi/mMmgywwnMT5LClPUsg5RnYSIUhzQOu8KeImLmBiAafc1uUsyBmjVN5PDIDvV+EwDiwUQAApUA89ntqMAQeEKK/YCg/aDoK7lSzptuYCMP9yHN4FsIIELeugywsbFtAuUHmSNlsusEXJlG22CGgQSkCDLQLqhRJQZysI/uQ0VKIUQp9foVkAlF8uWHmSyrBdYKmSLaVhE1AinICisAmICScgP2wCyoQTUBI2AQnhBMyETcAO4QTsDC0PwBJI5e9LYLVgAiaBauj0IwwL6BGuPAlVqr1av9DoAd5R2e//ecHDwJ8LqNSj7WSEEA+6KXpMRUuOBBYEEfwqVGrzQkGECJjlDtGrIILgvogpT0IrlqdGqRcCelU0Zb/xKqBSOzOSEcZm0yC4R0Vb9pq6QHfECdjlexVA9F+Jw1slswWuI+uh43M/FtCVA8qTdPh1gU6VG9Kh7QJc+X2MQAvMaw+jDHpO61hAY44oT0Jd7FZdF2hXuSVbdQlodjn3JSLKus2zRZcAt8dMJyJCQJ/LuVqtVFj9v7v7lkq1xJ8JT30neP4jGecTWg0RLiedH1N/rY7PXxJOwBWeJ72P8C3jWpFOLZCX9rk/bQPSkHDzH2Krpj7A8Yxr+TouMMmsjTi5Ap+nvsAboXf/E1CcNldy2UHHinVdYJj9vdzl2mmhBJxzmesy4BFwU5cAeuOjco5rNOh7YcrT0lcxx3zpcV5toLvFIYeEEdBndbs8+9d1IcrfpqBtfbs8CiZ6SkSvt1VlMepTvtICHcb9DuC73sefUrOkJ4spMlV3XSbKz9sU9egObbwE2TR7SnK2BzF/o44P3IBebKQNiqOW7/4YF2xNxiMZ3HUpD0sfkDVYWwW4KpwVtgzSe8Zn07PWUAiAxIUXQ526BOi+9EBp5QD7fY3GKpLgHuMEt9qpWHmiUm+dUOVG+3yrgVUqtQljBbDIqxfzOHeB+9pxzCAPyOOJFnP/0KkgyRy/8ufvjGkff7GYx3Y2Z9LRuWEzaWNPQYdZvzHwrwADAG+u/Wg4e38MAAAAAElFTkSuQmCC);
                      -webkit-mask-size: cover;
                      background-color: #000;
                      
                  }
                  button span {
                      display: inline-block;
                      vertical-align: middle;
                      font-size: 18px;
                      margin-left: 5px;
                      letter-spacing: 2px;
                  }
                  button:hover i {
                      background-color: #fff;
                  }
                  #info {
                      text-align: center;
                  }
                  #avatar {
                      width: 100px;
                      height: 100px;
                      border-radius: 100%;
                      object-fit: cover;
                  }
                  #nick {
                      font-size: 18px;
                      display: block;
                      margin: 15px 0;
                  }
              </style>
          </head>
          <body>
              <button id="login" style="display:none"><i></i><span>登錄</span></button>
              <div id='info' style="display:none;">
                  <img id="avatar" src="https://ui.qzone.com/100" alt="">
                  <span id="nick">您好,測試用戶</span>
                  <button id="signOut"><span>注銷</span></button>
              </div>
              <script type="text/javascript" src="//qzonestyle.gtimg.cn/qzone/openapi/qc_loader.js"charset="utf-8">
              </script>
          <script>
          
              var options = {
                  appId : 101870587, //這個appId 是這個demo的,業(yè)務(wù)請使用自己的appid
                  //s_url 這個參數(shù)業(yè)務(wù)可以自定,目的是讓業(yè)務(wù)在回調(diào)頁知道怎么回調(diào)到發(fā)起登錄的頁面
                  // 換成自己的也行
                  redirectURI : 'https://qq-web.cdn-go.cn/connect-demo/latest/callback.html?s_url='+encodeURIComponent(location.href)
              }
              //初始化一下sdk
              QC.init(options);
          
          
              //未登錄,顯示登錄按鈕
              if(!QC.Login.check()){
                  document.getElementById('login').style.display='block'
              //登錄態(tài)檢查通過,獲取個人信息
              }else{
                  QC.Login.getMe(function(openId,accessToken){
                      QC.api("get_user_info").success(function (req) {
                          document.getElementById('info').style.display='block'
                          // document.getElementById('avatar').src = req.data.nickname;
                          document.getElementById('nick').innerText = '您好,'+req.data.nickname;
                      })
                  })
                  
              }   
          
          
              var loginBtn =document.getElementById('login')
              var signoutBtn  = document.getElementById('signOut')
              if(window.addEventListener){
                  var clicked =false
                  loginBtn.addEventListener('click',function(){
                      if(clicked){
                          cosole.log('防止手抖')
                          return;
                      }
                      clicked=true;
                      
                      setTimeout(function(){clicked=false},500)
                      //通過這個方法來打開登錄頁
                      QC.Login.showPopup(options)
                  })
                  signoutBtn.addEventListener('click',function(){
                      QC.Login.signOut();//注銷
                      location.reload();//頁面刷新下
                  })
              }else{
                  //TODO: 兼容ie老版本
              }
          
              
          </script>
          </body>
          </html>
          1. 下載sdk本地調(diào)試
          2. 一定記得重新提交,如果審核不過,就刪除應(yīng)用再次創(chuàng)建
          3. 如果還有問題,推薦大家騰訊開放平臺的客服:騰訊應(yīng)用開放平臺




          接入大致流程(以下內(nèi)容來自官網(wǎng))

          1.注冊開發(fā)者

          1. 在QQ互聯(lián)開放平臺首頁 https://connect.qq.com/ ,點(diǎn)擊右上角的“登錄”按鈕,使用QQ賬號登錄,如下圖所示:

          重要提示:
          開發(fā)者QQ號碼一旦注冊不能變更,
          建議使用公司公共QQ號碼而不是員工私人號碼注冊,以免遇到員工離職等情況造成不必要的麻煩。


          2. 登錄成功后會跳轉(zhuǎn)到開發(fā)者注冊頁面,在注冊頁面按要求提交公司或個人的基本資料。下圖所示的是公司注冊頁面:


          3.按要求提交資料后,審核人員會進(jìn)行審核,通過審核即可成為開發(fā)者。

          網(wǎng)站應(yīng)用及移動應(yīng)用接入申請


          應(yīng)用接入前,首先需進(jìn)行申請,獲得對應(yīng)的appid與appkey,以保證后續(xù)流程中可正確對網(wǎng)站與用戶進(jìn)行驗(yàn)證與授權(quán)。

          1.1 創(chuàng)建應(yīng)用

          開發(fā)者注冊完成后,點(diǎn)擊“應(yīng)用管理”按鈕。


          跳轉(zhuǎn)到qq互聯(lián)管理中心頁面,點(diǎn)擊創(chuàng)建應(yīng)用。


          選擇需要創(chuàng)建的應(yīng)用類型,我們以網(wǎng)站應(yīng)用為例:


          點(diǎn)擊創(chuàng)建網(wǎng)站應(yīng)用后,按要求完善信息:


          1. 網(wǎng)站回調(diào)地址填寫規(guī)范:https://wiki.connect.qq.com/%E5%9B%9E%E8%B0%83%E5%9C%B0%E5%9D%80%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98%E5%8F%8A%E4%BF%AE%E6%94%B9%E6%96%B9%E6%B3%95
          2. 備案信息填寫規(guī)范:http://www.miitbeian.gov.cn/publish/query/indexFirst.action


          網(wǎng)站信息填寫完成,點(diǎn)擊“創(chuàng)建應(yīng)用”后,網(wǎng)站應(yīng)用創(chuàng)建完成,點(diǎn)擊“應(yīng)用管理”,進(jìn)入管理中心,在管理中心可以查看到網(wǎng)站獲取的appid和appkey,如下圖所示:


          備注:創(chuàng)建移動應(yīng)用與網(wǎng)站應(yīng)用步驟方法一致,在此不贅述。

          1.2 網(wǎng)站信息完善

          點(diǎn)擊“應(yīng)用中心”,應(yīng)用右側(cè)的“查看”,進(jìn)入應(yīng)用詳情頁面。


          應(yīng)用詳情頁面可點(diǎn)擊“修改”來編輯應(yīng)用“基本信息”和“平臺信息”。



          點(diǎn)擊“應(yīng)用接口”可查看已獲取的接口,使用QQ登錄功能。

          客戶需求在h5調(diào)用掃一掃來識別二維碼,經(jīng)調(diào)研發(fā)現(xiàn)使用微信sdk是最好的方式。官網(wǎng)的文檔(https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html)寫的很好,就是太傷肝,坑太多。下面我給大家詳細(xì)描述一下實(shí)現(xiàn)過程。

          步驟

          1、綁定域名

          先登錄微信公眾平臺進(jìn)入“公眾號設(shè)置”的“功能設(shè)置”里填寫“JS接口安全域名”。ip白名單記得也需要配置,不然后端會報(bào)錯,無法調(diào)用接口。

          2、引入JS文件

          npm方式安裝,npm install jweixin-module --save ,uniapp需要建立package.json

          var jWeixin = require('jweixin-module')


          3、通過config接口注入權(quán)限驗(yàn)證配置

          wx.config({
           debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時(shí)才會打印。
           appId: '', // 必填,公眾號的唯一標(biāo)識
           timestamp: , // 必填,生成簽名的時(shí)間戳,與后端保持一致
           nonceStr: '', // 必填,生成簽名的隨機(jī)串,與后端保持一致
           signature: '',// 必填,簽名,后端返回的值,需要把當(dāng)前頁面的url傳遞到后端,不然簽名會無效
           jsApiList: [] // 必填,需要使用的JS接口列表
          });
          

          4、java獲取token,ticket,簽名

          下面的三步一個參數(shù)都不能錯,不然就很難搞,token和ticket需要緩存起來,有訪問次數(shù)限制。

          • 獲取token
          String tokenData =
             "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
                 + APPID
                 + "&secret="
                 + SECRET;
          String resp = HttpUtils.sendGet(tokenData);
          
          • 獲取ticket
          String ticketUrl =
             "https://api.weixin.qq.com/cgi-bin/ticket/getticket?"
                 + "access_token="
                 + accessToken
                 + "&type=jsapi";
          String resp = HttpUtils.sendGet(ticketUrl);
          
          • 獲取簽名
          String url = ??? // 前端的請求頁面
          String ticket = String.valueOf(jsonObject.get("ticket"));
          String nonceStr = UUID.randomUUID().toString();
          String timestamp = Long.toString(System.currentTimeMillis() / 1000);
          String string1 =
             new StringBuilder("jsapi_ticket=")
                 .append(ticket)
                 .append("&noncestr=")
                 .append(nonceStr)
                 .append("×tamp=")
                 .append(timestamp)
                 .append("&url=")
                 .append(url)
                 .toString();
          // 得到簽名
          String signature = encryptSHA(string1);
          
           /**
           * sha
           */
           private static String encryptSHA(String signStr) {
            StringBuffer hexValue = new StringBuffer();
            try {
            MessageDigest sha = MessageDigest.getInstance("SHA-1");
            byte[] byteArray = signStr.getBytes("UTF-8");
            byte[] md5Bytes = sha.digest(byteArray);
            for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16) {
            hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
            }
            } catch (Exception e) {
            e.printStackTrace();
            return "";
            }
            return hexValue.toString();
           }
          

          5、調(diào)用掃碼

          this.$wx.scanQRCode((res) => {this.$u.route('pages/my/device', {serialNo:res.resultStr});
          

          避坑指南

          1、通過后端同學(xué)獲取調(diào)用微信sdk所需的簽名過程中,需要注意跨域問題;

          2、用微信sdk前提必須是微信容器,換句話說就是微信瀏覽器打開,才能使用微信sdk;

          3、如何在開發(fā)本地環(huán)境去測試微信sdk的調(diào)用情況,可以做內(nèi)網(wǎng)穿透,使用微信開發(fā)者工具調(diào)試;

          4、在微信容器使用微信sdk報(bào)錯,config報(bào)錯:config:invalid signature,這一步卡了我很久,嚴(yán)格執(zhí)行步驟4,可以少走很多彎路;如果你是IOS,請記住SPA不會即時(shí)改變url,需要全局緩存頁面地址;

          5、報(bào)錯config:fail,invalid url domain,微信公眾號接口提前配置好;

          最后,祝你好運(yùn)。

          如若轉(zhuǎn)載,請注明出處:開源字節(jié) https://sourcebyte.vip/article/349.html

          、支付寶環(huán)境準(zhǔn)備

          1、注冊支付寶開放平臺

          https://open.alipay.com/platform/home.htm 選擇支付寶登錄就好

          2、創(chuàng)建支付應(yīng)用

          這里以網(wǎng)頁應(yīng)用為例

          開發(fā)者中心-->網(wǎng)頁&移動應(yīng)用-->支付接入 根據(jù)要求填寫信息




          創(chuàng)建完成



          注:正式使用是要提交審核通過上線了 才能使用。測試,支付寶為我們提供了沙箱環(huán)境。后面演示 使用沙箱環(huán)境。

          3、開發(fā)項(xiàng)設(shè)置。

          設(shè)置加簽方式,私鑰與支付寶公鑰。(私鑰公鑰很重要)

          這里支付寶為我們提供了生成私鑰公鑰的工具。下載下來使用即可。




          這里一定要保存好你的私鑰。將公鑰復(fù)制進(jìn)去 生成支付寶公鑰。



          二、開發(fā)環(huán)境準(zhǔn)備

          1、沙箱環(huán)境

          支付寶為方便我們在應(yīng)用審核過程中進(jìn)行開發(fā),為大家提供了沙箱測試環(huán)境。進(jìn)入沙箱,系統(tǒng)會默認(rèn)生成沙箱環(huán)境應(yīng)用,供我們使用。

          開發(fā)者中心-->研發(fā)服務(wù)-->沙箱



          同樣我們需要設(shè)置一下秘鑰。注意這里的網(wǎng)關(guān)是https://openapi.alipaydev.com/gateway.do,和正式環(huán)境是有區(qū)別的 。

          下載一個沙箱環(huán)境的支付寶錢包,供開發(fā)使用,使用沙箱環(huán)境測試,正式的支付寶是操作不了的

          2、新建springboot項(xiàng)目

          過程省略

          3、添加支付寶maven依賴

          <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
          <dependency>
           <groupId>com.alipay.sdk</groupId>
           <artifactId>alipay-sdk-java</artifactId>
           <version>3.7.110.ALL</version>
          </dependency>
          ?

          4、根據(jù)文檔中心提供的sdk書寫支付代碼

          阿里SDK 項(xiàng)目結(jié)構(gòu)如下,下面我將其整合成了HTML方式。


          1>新建阿里配置類文件AlipayConig

          packagecom.szz.alipay.config;
          ?
          importjava.io.FileWriter;
          importjava.io.IOException;
          ?
          /* *
          *類名:AlipayConfig
          *功能:基礎(chǔ)配置類
          *詳細(xì):設(shè)置帳戶有關(guān)信息及返回路徑
          *修改日期:2017-04-05
          *說明:
          *以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據(jù)自己網(wǎng)站的需要,按照技術(shù)文檔編寫,并非一定要使用該代碼。
          *該代碼僅供學(xué)習(xí)和研究支付寶接口使用,只是提供一個參考。
          */
          ?
          publicclassAlipayConfig{
          ?
          //請?jiān)谶@里配置您的基本信息
          ?
           // 應(yīng)用ID,您的APPID,收款賬號既是您的APPID對應(yīng)支付寶賬號
           publicstaticStringapp_id="2018070560544403";
          ?
           // 商戶私鑰,您的PKCS8格式RSA2私鑰
           publicstaticStringmerchant_private_key="";
          ?
           // 支付寶公鑰,查看地址:https://openhome.alipay.com/platform/keyManage.htm 對應(yīng)APPID下的支付寶公鑰。
           publicstaticStringalipay_public_key="";
          ?
           // 服務(wù)器異步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
           publicstaticStringnotify_url="http://工程公網(wǎng)訪問地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";
          ?
           // 頁面跳轉(zhuǎn)同步通知頁面路徑 需http://格式的完整路徑,不能加?id=123這類自定義參數(shù),必須外網(wǎng)可以正常訪問
           publicstaticStringreturn_url="http://kcjvsv.natappfree.cc/auth";//"http://工程公網(wǎng)訪問地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
          ?
           // 簽名方式
           publicstaticStringsign_type="RSA2";
          ?
           // 字符編碼格式
           publicstaticStringcharset="utf-8";
          ?
           // 支付寶網(wǎng)關(guān)
           publicstaticStringgatewayUrl="https://openapi.alipay.com/gateway.do";
          ?
           // 支付寶網(wǎng)關(guān)
           publicstaticStringlog_path="C:\\";
          ?
          ?
          ?
           /**
           * 寫日志,方便測試(看網(wǎng)站需求,也可以改成把記錄存入數(shù)據(jù)庫)
           *
           * @param sWord 要寫入日志里的文本內(nèi)容
           */
           publicstaticvoidlogResult(StringsWord) {
           FileWriterwriter=null;
           try{
           writer=newFileWriter(log_path+"alipay_log_"+System.currentTimeMillis() +".txt");
           writer.write(sWord);
           } catch(Exceptione) {
           e.printStackTrace();
           } finally{
           if(writer!=null) {
           try{
           writer.close();
           } catch(IOExceptione) {
           e.printStackTrace();
           }
           }
           }
           }
          }
          ?

          2>測試主頁面

          <!DOCTYPE html>
          <htmllang="en">
          <head>
           <metacharset="UTF-8">
           <title>支付寶電腦網(wǎng)站支付</title>
           <style>
           * {
           margin: 0;
           padding: 0;
           }
          ?
           ul, ol{
           list-style: none;
           }
          ?
           body{
           font-family: "Helvetica Neue", Helvetica, Arial, "Lucida Grande",
           sans-serif;
           }
          ?
           .tab-head{
           margin-left: 120px;
           margin-bottom: 10px;
           }
          ?
           .tab-content{
           clear: left;
           display: none;
           }
          ?
           h2{
           border-bottom: solid#02aaf12px;
           width: 200px;
           height: 25px;
           margin: 0;
           float: left;
           text-align: center;
           font-size: 16px;
           }
          ?
           .selected{
           color: #FFFFFF;
           background-color: #02aaf1;
           }
          ?
           .show{
           clear: left;
           display: block;
           }
          ?
           .hidden{
           display: none;
           }
          ?
           .new-btn-login-sp{
           padding: 1px;
           display: inline-block;
           width: 75%;
           }
          ?
           .new-btn-login{
           background-color: #02aaf1;
           color: #FFFFFF;
           font-weight: bold;
           border: none;
           width: 100%;
           height: 30px;
           border-radius: 5px;
           font-size: 16px;
           }
          ?
           #main{
           width: 100%;
           margin: 0auto;
           font-size: 14px;
           }
          ?
           .red-star{
           color: #f00;
           width: 10px;
           display: inline-block;
           }
          ?
           .null-star{
           color: #fff;
           }
          ?
           .content{
           margin-top: 5px;
           }
          ?
           .contentdt{
           width: 100px;
           display: inline-block;
           float: left;
           margin-left: 20px;
           color: #666;
           font-size: 13px;
           margin-top: 8px;
           }
          ?
           .contentdd{
           margin-left: 120px;
           margin-bottom: 5px;
           }
          ?
           .contentddinput{
           width: 85%;
           height: 28px;
           border: 0;
           -webkit-border-radius: 0;
           -webkit-appearance: none;
           }
          ?
           #foot{
           margin-top: 10px;
           position: absolute;
           bottom: 15px;
           width: 100%;
           }
          ?
           .foot-ul{
           width: 100%;
           }
          ?
           .foot-ulli{
           width: 100%;
           text-align: center;
           color: #666;
           }
          ?
           .note-help{
           color: #999999;
           font-size: 12px;
           line-height: 130%;
           margin-top: 5px;
           width: 100%;
           display: block;
           }
          ?
           #btn-dd{
           margin: 20px;
           text-align: center;
           }
          ?
           .foot-ul{
           width: 100%;
           }
          ?
           .one_line{
           display: block;
           height: 1px;
           border: 0;
           border-top: 1pxsolid#eeeeee;
           width: 100%;
           margin-left: 20px;
           }
          ?
           .am-header{
           display: -webkit-box;
           display: -ms-flexbox;
           display: box;
           width: 100%;
           position: relative;
           padding: 7px0;
           -webkit-box-sizing: border-box;
           -ms-box-sizing: border-box;
           box-sizing: border-box;
           background: #1D222D;
           height: 50px;
           text-align: center;
           -webkit-box-pack: center;
           -ms-flex-pack: center;
           box-pack: center;
           -webkit-box-align: center;
           -ms-flex-align: center;
           box-align: center;
           }
          ?
           .am-headerh1{
           -webkit-box-flex: 1;
           -ms-flex: 1;
           box-flex: 1;
           line-height: 18px;
           text-align: center;
           font-size: 18px;
           font-weight: 300;
           color: #fff;
           }
           </style>
          </head>
          <bodytext=#000000bgColor="#ffffff"leftMargin=0topMargin=4>
          <headerclass="am-header">
           <h1>支付寶電腦網(wǎng)站支付體驗(yàn)入口頁</h1>
          </header>
          <divid="main">
           <divid="tabhead"class="tab-head">
           <h2id="tab1"class="selected"name="tab">付 款</h2>
           <h2id="tab2"name="tab">交 易 查 詢</h2>
           <h2id="tab3"name="tab">退 款</h2>
           <h2id="tab4"name="tab">退 款 查 詢</h2>
           <h2id="tab5"name="tab">交 易 關(guān) 閉</h2>
           </div>
           <formname=alipaymentaction=/paymethod=post
           target="_blank">
           <divid="body1"class="show"name="divcontent">
           <dlclass="content">
           <dt>商戶訂單號 :</dt>
           <dd>
           <inputid="WIDout_trade_no"name="WIDout_trade_no"/>
           </dd>
           <hrclass="one_line">
           <dt>訂單名稱 :</dt>
           <dd>
           <inputid="WIDsubject"name="WIDsubject"/>
           </dd>
           <hrclass="one_line">
           <dt>付款金額 :</dt>
           <dd>
           <inputid="WIDtotal_amount"name="WIDtotal_amount"/>
           </dd>
           <hrclass="one_line">
           <dt>商品描述:</dt>
           <dd>
           <inputid="WIDbody"name="WIDbody"/>
           </dd>
           <hrclass="one_line">
           <dt></dt>
           <ddid="btn-dd">
           <spanclass="new-btn-login-sp">
           <buttonclass="new-btn-login"type="submit"
           style="text-align: center;">付 款</button>
           </span><spanclass="note-help">如果您點(diǎn)擊“付款”按鈕,即表示您同意該次的執(zhí)行操作。</span>
           </dd>
           </dl>
           </div>
           </form>
           <formname=tradequeryaction=/querymethod=post
           target="_blank">
           <divid="body2"class="tab-content"name="divcontent">
           <dlclass="content">
           <dt>商戶訂單號 :</dt>
           <dd>
           <inputid="WIDTQout_trade_no"name="WIDTQout_trade_no"/>
           </dd>
           <hrclass="one_line">
           <dt>支付寶交易號 :</dt>
           <dd>
           <inputid="WIDTQtrade_no"name="WIDTQtrade_no"/>
           </dd>
           <hrclass="one_line">
           <dt></dt>
           <ddid="btn-dd">
           <spanclass="new-btn-login-sp">
           <buttonclass="new-btn-login"type="submit"
           style="text-align: center;">交 易 查 詢</button>
           </span><spanclass="note-help">商戶訂單號與支付寶交易號二選一,如果您點(diǎn)擊“交易查詢”按鈕,即表示您同意該次的執(zhí)行操作。</span>
           </dd>
           </dl>
           </div>
           </form>
           <formname=traderefundaction=alipay.trade.refund.jspmethod=post
           target="_blank">
           <divid="body3"class="tab-content"name="divcontent">
           <dlclass="content">
           <dt>商戶訂單號 :</dt>
           <dd>
           <inputid="WIDTRout_trade_no"name="WIDTRout_trade_no"/>
           </dd>
           <hrclass="one_line">
           <dt>支付寶交易號 :</dt>
           <dd>
           <inputid="WIDTRtrade_no"name="WIDTRtrade_no"/>
           </dd>
           <hrclass="one_line">
           <dt>退款金額 :</dt>
           <dd>
           <inputid="WIDTRrefund_amount"name="WIDTRrefund_amount"/>
           </dd>
           <hrclass="one_line">
           <dt>退款原因 :</dt>
           <dd>
           <inputid="WIDTRrefund_reason"name="WIDTRrefund_reason"/>
           </dd>
           <hrclass="one_line">
           <dt>退款請求號 :</dt>
           <dd>
           <inputid="WIDTRout_request_no"name="WIDTRout_request_no"/>
           </dd>
           <hrclass="one_line">
           <dt></dt>
           <ddid="btn-dd">
           <spanclass="new-btn-login-sp">
           <buttonclass="new-btn-login"type="submit"
           style="text-align: center;">退 款</button>
           </span><spanclass="note-help">商戶訂單號與支付寶交易號二選一,如果您點(diǎn)擊“退款”按鈕,即表示您同意該次的執(zhí)行操作。</span>
           </dd>
           </dl>
           </div>
           </form>
           <formname=traderefundquery
           action=alipay.trade.fastpay.refund.query.jspmethod=post
           target="_blank">
           <divid="body4"class="tab-content"name="divcontent">
           <dlclass="content">
           <dt>商戶訂單號 :</dt>
           <dd>
           <inputid="WIDRQout_trade_no"name="WIDRQout_trade_no"/>
           </dd>
           <hrclass="one_line">
           <dt>支付寶交易號 :</dt>
           <dd>
           <inputid="WIDRQtrade_no"name="WIDRQtrade_no"/>
           </dd>
           <hrclass="one_line">
           <dt>退款請求號 :</dt>
           <dd>
           <inputid="WIDRQout_request_no"name="WIDRQout_request_no"/>
           </dd>
           <hrclass="one_line">
           <dt></dt>
           <ddid="btn-dd">
           <spanclass="new-btn-login-sp">
           <buttonclass="new-btn-login"type="submit"
           style="text-align: center;">退 款 查 詢</button>
           </span><spanclass="note-help">商戶訂單號與支付寶交易號二選一,如果您點(diǎn)擊“退款查詢”按鈕,即表示您同意該次的執(zhí)行操作。</span>
           </dd>
           </dl>
           </div>
           </form>
           <formname=tradecloseaction=alipay.trade.close.jspmethod=post
           target="_blank">
           <divid="body5"class="tab-content"name="divcontent">
           <dlclass="content">
           <dt>商戶訂單號 :</dt>
           <dd>
           <inputid="WIDTCout_trade_no"name="WIDTCout_trade_no"/>
           </dd>
           <hrclass="one_line">
           <dt>支付寶交易號 :</dt>
           <dd>
           <inputid="WIDTCtrade_no"name="WIDTCtrade_no"/>
           </dd>
           <hrclass="one_line">
           <dt></dt>
           <ddid="btn-dd">
           <spanclass="new-btn-login-sp">
           <buttonclass="new-btn-login"type="submit"
           style="text-align: center;">交 易 關(guān) 閉</button>
           </span><spanclass="note-help">商戶訂單號與支付寶交易號二選一,如果您點(diǎn)擊“交易關(guān)閉”按鈕,即表示您同意該次的執(zhí)行操作。</span>
           </dd>
           </dl>
           </div>
           </form>
           <divid="foot">
           <ulclass="foot-ul">
           <li>支付寶版權(quán)所有 2015-2018 ALIPAY.COM</li>
           </ul>
           </div>
          </div>
          </body>
          <scriptlanguage="javascript">
           vartabs=document.getElementsByName('tab');
           varcontents=document.getElementsByName('divcontent');
          ?
           (functionchangeTab(tab) {
           for(vari=0, len=tabs.length; i<len; i++) {
           tabs[i].onmouseover=showTab;
           }
           })();
          ?
           functionshowTab() {
           for(vari=0, len=tabs.length; i<len; i++) {
           if(tabs[i] ===this) {
           tabs[i].className='selected';
           contents[i].className='show';
           } else{
           tabs[i].className='';
           contents[i].className='tab-content';
           }
           }
           }
          ?
           functionGetDateNow() {
           varvNow=newDate();
           varsNow="";
           sNow+=String(vNow.getFullYear());
           sNow+=String(vNow.getMonth() +1);
           sNow+=String(vNow.getDate());
           sNow+=String(vNow.getHours());
           sNow+=String(vNow.getMinutes());
           sNow+=String(vNow.getSeconds());
           sNow+=String(vNow.getMilliseconds());
           document.getElementById("WIDout_trade_no").value= sNow;
           document.getElementById("WIDsubject").value="測試";
           document.getElementById("WIDtotal_amount").value="0.01";
           }
           GetDateNow();
          </script>
          </html>

          3>支付,查詢,驗(yàn)簽接口

          packagecom.szz.alipay.ali;
          ?
          importcom.alipay.api.AlipayApiException;
          importcom.alipay.api.request.AlipayTradePagePayRequest;
          importcom.alipay.api.request.AlipayTradeQueryRequest;
          importcom.szz.alipay.config.AlipayConfig;
          importcom.szz.alipay.service.AlipayTradeService;
          importorg.springframework.beans.factory.annotation.Autowired;
          importorg.springframework.web.bind.annotation.RequestMapping;
          importorg.springframework.web.bind.annotation.RestController;
          ?
          importjavax.servlet.http.HttpServletRequest;
          importjava.io.UnsupportedEncodingException;
          ?
          /**
          * @program admin
          * @description: 交易
          * @author: szz
          * @create: 2019/11/25 16:15
          */
          @RestController
          publicclassAlipayTrede{
          ?
           @Autowired
           privateAlipayTradeServicealipayTradeService;
          ?
           @RequestMapping("/pay")
           publicStringtrade(HttpServletRequestrequest) throwsAlipayApiException, UnsupportedEncodingException{
          ?
           //設(shè)置請求參數(shù)
           AlipayTradePagePayRequestalipayRequest=newAlipayTradePagePayRequest();
           alipayRequest.setReturnUrl(AlipayConfig.return_url);
           alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
          ?
           //商戶訂單號,商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號,必填
           Stringout_trade_no=request.getParameter("WIDout_trade_no");
           //付款金額,必填
           Stringtotal_amount=request.getParameter("WIDtotal_amount");
           //訂單名稱,必填
           Stringsubject=request.getParameter("WIDsubject");
           //商品描述,可空
           Stringbody=request.getParameter("WIDbody");
          ?
           //輸出
          // out.println(result);
           returnalipayTradeService.pay(out_trade_no,total_amount,subject,body);
           }
          ?
           @RequestMapping("/query")
           publicStringquery(HttpServletRequestrequest) throwsAlipayApiException, UnsupportedEncodingException{
           //設(shè)置請求參數(shù)
           AlipayTradeQueryRequestalipayRequest=newAlipayTradeQueryRequest();
          ?
           //商戶訂單號,商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號
           Stringout_trade_no=request.getParameter("WIDTQout_trade_no");
           //支付寶交易號
           Stringtrade_no=request.getParameter("WIDTQtrade_no");
           //請二選一設(shè)置
          ?
           alipayRequest.setBizContent("{\"out_trade_no\":\""+out_trade_no+"\","+"\"trade_no\":\""+trade_no+"\"}");
          ?
          ?
           returnalipayTradeService.query(out_trade_no,trade_no);
           }
          ?
           @RequestMapping("/auth")
           publicStringauth(HttpServletRequestrequest) throwsAlipayApiException, UnsupportedEncodingException{
           returnalipayTradeService.auth(request);
           }
          }
          packagecom.szz.alipay.service;
          ?
          importcom.alipay.api.AlipayApiException;
          importcom.alipay.api.AlipayClient;
          importcom.alipay.api.DefaultAlipayClient;
          importcom.alipay.api.internal.util.AlipaySignature;
          importcom.alipay.api.request.AlipayTradePagePayRequest;
          importcom.alipay.api.request.AlipayTradeQueryRequest;
          importcom.szz.alipay.config.AlipayConfig;
          importorg.springframework.stereotype.Service;
          ?
          importjavax.servlet.http.HttpServletRequest;
          importjava.io.UnsupportedEncodingException;
          importjava.util.HashMap;
          importjava.util.Iterator;
          importjava.util.Map;
          ?
          /**
          * @program admin
          * @description: 支付寶支付
          * @author: szz
          * @create: 2019/11/26 15:23
          */
          @Service
          publicclassAlipayTradeServiceImplimplementsAlipayTradeService{
          ?
           /**
           * 獲得初始化的AlipayClient
           */
           privatefinalAlipayClientalipayClient=newDefaultAlipayClient(AlipayConfig.gatewayUrl,
           AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json",
           AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);
          ?
          ?
           /**
           * 訂單支付
           *
           * @param outTradeNo 商戶訂單號,商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號,必填
           * @param totalAmount 付款金額,必填
           * @param subject 訂單名稱,必填
           * @param desc 商品描述,可空
           * @return
           */
           @Override
           publicStringpay(StringoutTradeNo, StringtotalAmount, Stringsubject, Stringdesc) {
          ?
           //設(shè)置請求參數(shù)
           AlipayTradePagePayRequestalipayRequest=newAlipayTradePagePayRequest();
           alipayRequest.setReturnUrl(AlipayConfig.return_url);
           alipayRequest.setNotifyUrl(AlipayConfig.notify_url);
          ?
          ?
           alipayRequest.setBizContent("{\"out_trade_no\":\""+outTradeNo+"\","
           +"\"total_amount\":\""+totalAmount+"\","
           +"\"subject\":\""+subject+"\","
           +"\"body\":\""+desc+"\","
           +"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
          ?
           //請求
           Stringresult=null;
           try{
           result=alipayClient.pageExecute(alipayRequest).getBody();
           } catch(AlipayApiExceptione) {
           e.printStackTrace();
           }
          ?
          ?
           returnresult;
           }
          ?
           /**
           * 訂單查詢
           *
           * @param outTradeNo 商戶訂單號,商戶網(wǎng)站訂單系統(tǒng)中唯一訂單號
           * @param tradeNo 支付寶交易號
           * 請二選一設(shè)置
           * @return
           */
           @Override
           publicStringquery(StringoutTradeNo, StringtradeNo) {
          ?
           //設(shè)置請求參數(shù)
           AlipayTradeQueryRequestalipayRequest=newAlipayTradeQueryRequest();
          ?
           alipayRequest.setBizContent("{\"out_trade_no\":\""+outTradeNo+"\","+"\"trade_no\":\""+tradeNo+"\"}");
          ?
           //請求
           Stringresult=null;
           try{
           result=alipayClient.execute(alipayRequest).getBody();
           } catch(AlipayApiExceptione) {
           e.printStackTrace();
           }
          ?
           returnresult;
           }
          ?
           /**
           * 同步驗(yàn)證
           * @param request
           * @return
           */
           publicStringauth(HttpServletRequestrequest) {
          ?
           //獲取支付寶GET過來反饋信息
           Map<String, String>params=newHashMap<String, String>();
           Map<String, String[]>requestParams=request.getParameterMap();
           for(Iterator<String>iter=requestParams.keySet().iterator(); iter.hasNext(); ) {
           Stringname=(String) iter.next();
           String[] values=(String[]) requestParams.get(name);
           StringvalueStr="";
           for(inti=0; i<values.length; i++) {
           valueStr=(i==values.length-1) ?valueStr+values[i]
           : valueStr+values[i] +",";
           }
           //亂碼解決,這段代碼在出現(xiàn)亂碼時(shí)使用
           try{
           valueStr=newString(valueStr.getBytes("ISO-8859-1"), "utf-8");
           } catch(UnsupportedEncodingExceptione) {
           e.printStackTrace();
           }
           params.put(name, valueStr);
           }
          ?
           booleansignVerified=false; //調(diào)用SDK驗(yàn)證簽名
           try{
           signVerified=AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type);
           } catch(AlipayApiExceptione) {
           e.printStackTrace();
           }
          ?
           //——請?jiān)谶@里編寫您的程序(以下代碼僅作參考)——
           if(signVerified) {
           //商戶訂單號
           Stringout_trade_no=null;
           try{
           out_trade_no=newString(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
           } catch(UnsupportedEncodingExceptione) {
           e.printStackTrace();
           }
          ?
           //支付寶交易號
           Stringtrade_no=null;
           try{
           trade_no=newString(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
           } catch(UnsupportedEncodingExceptione) {
           e.printStackTrace();
           }
          ?
           //付款金額
           Stringtotal_amount=null;
           try{
           total_amount=newString(request.getParameter("total_amount").getBytes("ISO-8859-1"), "UTF-8");
           } catch(UnsupportedEncodingExceptione) {
           e.printStackTrace();
           }
          ?
           System.out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);
           return"trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount;
           } else{
           System.out.println("驗(yàn)簽失敗");
           return"驗(yàn)簽失敗";
           }
           }
          }

          注:return_url支付成功返回頁面,這里必須是外網(wǎng)可以正常訪問的頁面。

          3>運(yùn)行代碼,如下界面



          付款




          這里我的外網(wǎng)地址訪問失效了。

          支付寶說明:一切交易以查詢結(jié)果為準(zhǔn),所以建議回調(diào)的地址設(shè)置成交易查詢結(jié)果。交易查詢可根據(jù)訂單號及支付寶訂單號查詢

          可以看到我剛才的支付結(jié)果是成功的。


          主站蜘蛛池模板: 冲田杏梨高清无一区二区| 国产亚洲自拍一区| 国模大尺度视频一区二区| bt7086福利一区国产| 国产精品成人国产乱一区| 亚洲色偷精品一区二区三区| 手机看片一区二区| 一区二区三区视频在线播放| 极品少妇一区二区三区四区| 色偷偷一区二区无码视频| 中文字幕在线视频一区| 国产日韩视频一区| 夜夜高潮夜夜爽夜夜爱爱一区| 国产日韩精品视频一区二区三区 | 日韩美一区二区三区| 国产精品福利一区二区久久| 老熟女五十路乱子交尾中出一区| 久久精品无码一区二区三区| 国产波霸爆乳一区二区| 亚洲一区二区三区在线观看精品中文| 日本一区二区三区精品国产| 日韩十八禁一区二区久久| 国产精品视频无圣光一区| 秋霞电影网一区二区三区| 国产午夜一区二区在线观看| 日本精品视频一区二区| 国产一区在线电影| 女人和拘做受全程看视频日本综合a一区二区视频 | 变态调教一区二区三区| 极品少妇伦理一区二区| 国产精品乱码一区二区三区 | 亚洲午夜电影一区二区三区| 亚洲av无码一区二区三区观看| 日韩免费一区二区三区在线| 少妇一晚三次一区二区三区| 国产精品电影一区二区三区| 无码AⅤ精品一区二区三区| 久久久久国产一区二区三区| 久久亚洲AV午夜福利精品一区| 亚洲一区二区久久| 免费精品一区二区三区在线观看|