위챗 JS-SDK 문서
WeChat JS-SDK 문서
# 🎜 🎜#
WeChat JS-SDK는 웹 개발자를 위한 WeChat 기반 WeChat 공개 플랫폼입니다. 개발 툴킷.
웹 개발자는 WeChat JS-SDK를 사용하여 사진, 이미지 선택, 음성, 위치 등 휴대폰 시스템의 기능을 효율적으로 사용할 수 있습니다. , 동시에 공유, 스캔, 쿠폰, 결제 등 WeChat 고유의 기능을 직접 사용할 수 있어 WeChat 사용자에게 더 나은 웹 경험을 제공합니다.
이 문서는 웹 개발자를 대상으로 WeChat JS-SDK 사용 방법 및 관련 주의사항을 소개하기 위해 작성되었습니다. 1단계: 도메인 이름 바인딩#🎜🎜 # 참고: 로그인 후 "개발자 센터"에서 해당 인터페이스 권한을 확인할 수 있습니다. 2단계: JS 파일 소개 JS 인터페이스(https 지원)를 호출해야 하는 페이지에 다음 JS 파일을 도입하세요: http://res.wx.qq.com/open/js/jweixin-1.0.0.js 주변기기 흔들기 기능을 사용해야 하는 경우 http://res.wx.qq.com/open/js/jweixin-1.1.0.js 을 소개하세요. 참고: AMD 사용을 지원합니다. /CMD 표준 모듈 로딩 방법 Loading 3단계: config 인터페이스를 통해 권한 확인 구성 주입 JS-SDK를 사용해야 하는 모든 페이지에서는 먼저 구성 정보를 주입해야 합니다. 그렇지 않으면 호출되지 않습니다(동일한 URL은 한 번만 호출하면 됩니다. URL을 변경하는 SPA의 웹 앱은 URL이 변경될 때마다 호출될 수 있습니다. 현재 Android WeChat 클라이언트는 pushState의 새로운 H5 기능을 지원하지 않으므로 pushState를 사용하여 웹 앱 페이지를 구현하면 서명이 실패하게 됩니다. 이 문제는 Android 6.2에서 해결됩니다. wx.config({ ) debug: true, // 디버그 모드를 켭니다. 들어오는 매개변수를 보려면 모든 API 호출의 반환 값이 클라이언트 측에 경고됩니다. , PC 측에서 열 수 있습니다. 매개변수 정보는 로그를 통해 인쇄되며, PC 측에서만 인쇄됩니다. appId: '', // 필수, 공식 계정의 고유 식별자입니다. timestamp: , // 필수, 서명 생성 Timestamp nonceStr: '', // 필수, 임의의 서명 문자열 생성 서명: '', // 필수, 서명 , 부록 1 참조 jsApiList: [] // 필수, 사용해야 하는 JS 인터페이스 목록, 모든 JS 인터페이스 목록은 부록 2를 참조하세요 }); 4단계: Ready 인터페이스를 통해 성공적인 검증 처리 wx.ready(function(){ ) // config 정보가 검증된 후 Ready 메소드가 실행됩니다. , 모든 인터페이스 호출은 config 인터페이스가 결과를 얻은 후 config는 클라이언트 측에서 비동기 작업이므로 페이지가 로드될 때 관련 인터페이스를 호출해야 하는 경우 준비 함수에서 관련 인터페이스를 호출해야 합니다. 사용자 인터페이스에 의해 트리거될 때 올바른 실행을 보장하며 직접 호출할 수 있으며 준비된 함수 }); wx.error(function(res){ ) // 구성 정보 확인에 실패하면 오류 함수는 예를 들어 서명이 만료되는 경우와 같이 실행됩니다. 특정 오류 정보는 config의 디버그 모드 또는 반환된 res 매개변수에서 볼 수 있습니다. 여기에서 서명을 업데이트할 수 있습니다. }) 모든 인터페이스는 wx 객체를 통해 호출됩니다(jWeixin 객체도 사용할 수 있음). 매개변수는 각 인터페이스에 전달되어야 하는 매개변수 외에 객체입니다. 그 자체에는 다음과 같은 일반 매개변수가 있습니다. 1.success: 인터페이스 호출이 성공하면 실행되는 콜백 함수입니다. 2.fail: 인터페이스 호출이 실패했을 때 실행되는 콜백 함수입니다. 3.complete: 인터페이스 호출이 완료되면 실행되는 콜백 함수는 성공, 실패에 관계없이 실행됩니다. 4.cancel: 사용자가 취소를 클릭할 때의 콜백 함수는 사용자가 작업을 취소하는 일부 API에서만 사용됩니다. 5.trigger: 메뉴의 버튼을 클릭했을 때 실행되는 메서드입니다. 이 메서드는 메뉴의 관련 인터페이스만 지원합니다. 참고: 클라이언트 공유 작업은 동기 작업이고 Ajax를 사용한 반환 패킷은 현재 반환되지 않으므로 이 공유의 내용을 수정하기 위해 트리거에서 ajax 비동기 요청을 사용하지 마십시오. 위 함수에는 모두 객체 유형인 하나의 매개변수가 있습니다. 각 인터페이스 자체에서 반환되는 데이터 외에도 값 형식이 다음과 같은 일반 속성 errMsg도 있습니다. 호출 성공: "xxx:ok", 여기서 xxx는 호출된 인터페이스의 이름 사용자가 취소한 경우: "xxx:cancel", 여기서 xxx는 호출된 인터페이스의 이름 호출 실패: 해당 값은 특정 오류 메시지입니다 현재 클라이언트 버전이 지정된 JS 인터페이스를 지원하는지 확인 wx.checkJsApi({ jsApiList: ['chooseImage ' ], // 감지해야 하는 JS 인터페이스 목록, 모든 JS 인터페이스 목록은 부록 2를 참조하세요. 성공: function(res) { // key- 형식으로 반환 값 쌍, 사용 가능한 API 값이 true입니다. False를 사용하지 마십시오. // 예: {"CheckResult": {"choooseimage": true}, "ErRMSG": "Checkjsapi: OK"}}}) 참고: checkJsApi 인터페이스는 클라이언트 6.0.2에 새로 도입된 예약된 인터페이스입니다. 첫 번째 단계에서 열린 인터페이스는 checkJsApi를 사용하지 않고도 감지할 수 있습니다. 공유 및 기타 불법 활동을 유도하지 않도록 주의하시기 바랍니다. 공식 계정 인터페이스 권한이 영구적으로 취소됩니다. 자세한 규칙은 다음을 확인하세요. 순간 관리 FAQ. "순간에 공유" 버튼 클릭 상태를 확인하고 공유 콘텐츠 인터페이스를 맞춤설정하세요 wx.onMenuShareTimeline({ title: '', // 제목 공유 링크: '', // 링크 공유 imgUrl: '', // 아이콘 공유 성공: 기능 () { 취소: 기능 () { ~ 사용자가 공유를 취소한 후 실행되는 콜백 함수 "친구에게 공유" 버튼 클릭 상태를 확인하고 공유 콘텐츠 인터페이스를 맞춤설정하세요 wx.onMenuShareAppMessage({ ) title: '', // 제목 공유 desc: '', // 설명 공유 링크: '', // 링크 공유 imgUrl: '', // 공유 아이콘 유형: '', // 공유 type, music, video or link, 공백으로 두면 기본값은 link dataUrl: '', // type이 music 또는 video인 경우 데이터 링크를 제공해야 하며 기본값은 비어 있습니다 성공 : 기능 () { ‐ ‐ 사용자가 공유를 확인한 후 실행됩니다. ‐‐‐‐‐‐‐‐‐'‐''''' 취소: 기능 () { 享 // 공유 후 실행된 콜백 기능을 사용자가 취소합니다 }}) "QQ에 공유" 버튼 클릭 상태를 확인하고 공유 콘텐츠 인터페이스를 맞춤설정하세요 wx.onMenuShareQQ({ ) title: '', // 제목 공유 desc: '', // 설명 공유 링크: '', // 링크 공유 imgUrl: '', // 아이콘 공유 성공: 함수 () { ㅋㅋ 공유 취소 후 실행 가능 } }); wx.onMenuShareWeibo({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { }}) wx.onMenuShareQZone({ title: '', // 分享标题 desc: '', // 分享描述 link: '', // 分享链接 imgUrl: '', // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { }}) 사진을 찍거나 모바일 앨범에서 사진을 선택하기 위한 인터페이스 wx.chooseImage({ 개수: 1, / / 기본값 9 sizeType: ['original', 'compressed'], // 원본 이미지인지 압축 이미지인지 지정할 수 있으며 기본적으로 둘 다 사용 가능합니다 sourceType: ['album ', 'camera'], // 소스가 사진 앨범인지 카메라인지 지정할 수 있습니다. 기본값은 둘 다입니다. Success: function (res) { var localIds = res.localIds; / 선택한 사진의 로컬 ID 목록을 반환합니다. localId는 img로 사용할 수 있습니다. 태그의 src 속성은 이미지를 표시합니다 } }); wx.previewImage({ current: '', // 현재 이미지를 표시하는 http 링크 urls: [] //필요 미리보기 사진 http 링크 목록 }); wx.uploadImage({ localId: '', // 업로드할 이미지의 로컬 ID는 chooseImage 인터페이스에서 가져옵니다 isShowProgressTips: 1, // 기본값은 1, 진행률 프롬프트 표시 성공: function (res) { var serverId = res.serverId; // 이미지의 서버 ID 반환 } }); 참고: 업로드된 이미지는 3일 동안 유효합니다. WeChat 멀티미디어 인터페이스를 사용하여 자신의 서버에 이미지를 다운로드할 수 있습니다. 여기서 얻은 서버 ID는 media_id입니다. wx.downloadImage({ ) serverId: '', // 다운로드할 이미지의 서버측 ID는 uploadImage 인터페이스 isShowProgressTips: 1, // 기본값은 1, 진행률 팁 표시 성공: function (res) { var localId = res.localId; // 이미지 } }); wx.startRecord(); wx.stopRecord({ 성공: function (res) { var localId = res.localId; } }); wx.onVoiceRecordEnd({ // 녹음 시간이 멈추지 않고 1분을 초과하면 전체 콜백이 실행됩니다 # 🎜🎜 # var localId = res.localId # 🎜🎜 # } }); wx.playVoice({ ) localId: '' // 재생될 오디오의 로컬 ID는 stopRecord 인터페이스에서 가져옵니다 }) ; wx.pauseVoice({ ) localId: '' // 일시중지됨 stopRecord 인터페이스 }); wx.stopVoice({ ) localId: '' // 중지해야 하는 오디오의 로컬 ID는 stopRecord 인터페이스에서 가져옵니다 }) wx.onVoicePlayEnd({ 성공: function (res) { var local Id = res.localI 디 / / 오디오 로컬 ID 반환 } }); wx.uploadVoice({ ) localId: '', // 업로드할 오디오의 로컬 ID는 stopRecord 인터페이스에서 가져옵니다 isShowProgressTips: 1, // 기본값은 1, 진행률 프롬프트 표시 Success: function (res) { var serverId = res.serverId; // 오디오의 서버 ID 반환 } }); 참고: 업로드된 음성은 3일 동안 유효합니다. WeChat 멀티미디어 인터페이스를 사용하여 자신의 서버에 음성을 다운로드할 수 있습니다. 여기서 얻은 서버 ID는 멀티미디어 파일의 현재 빈도 제한을 참조하세요. 다운로드 인터페이스는 하루 10,000회입니다. 필요한 경우 빈도를 늘리십시오. WeChat 공개 플랫폼에 로그인하여 개발 인터페이스 권한 목록의 임시 상한선을 높이십시오. wx.downloadVoice({ ) serverId: '', // 다운로드할 오디오의 서버측 ID는 uploadVoice 인터페이스 isShowProgressTips: 1, // 기본값은 1이며 진행률 팁을 표시합니다. Success: function (res) { var localId = res.localId; 오디오 } }); wx.translateVoice({ localId: '', // 필요 식별됨 녹음 관련 인터페이스에서 얻은 오디오의 로컬 ID isShowProgressTips: 1, // 기본값은 1, 진행률 프롬프트 표시 성공: 함수(res) { Alert(res.translateResult); // 음성 인식 결과 } }); wx.getNetworkType({ 성공: 함수(res) { var networkType = res.networkType; // 네트워크 유형 2g, 3g, 4g, wifi } }); wx.openLocation({ 위도: 0, // 위도 , 부동 소수점, 범위는 90 ~ -90 경도: 0, // 경도, 부동 소수점 수, 범위는 180 ~ -180 name: '', // 위치 이름 address: ' ', // 주소 세부정보 scale: 1, // 지도 확대/축소 수준, 모양 값, 범위는 1~28입니다. 기본값은 최대값입니다. infoUrl: '' // 보기 위치 인터페이스 하단 하이퍼링크, 클릭하여 이동 }); wx.getLocation({ ) type: 'wgs84', // 화성을 직접 반환하려는 경우 기본값은 wgs84입니다. openLocation 좌표, 'gcj02' 성공: function (res) { var latitude = res.latitude; // 위도, 부동 소수점 수, 범위는 90 ~ -90 var longitude = res.longitude; // 경도, 부동 소수점 수, 범위는 180 ~ -180입니다. var speed = res.speed; // 속도(초당 미터) var Accuracy = res.accuracy; 위치 정확도 } }); 인터페이스를 열어 주변 ibeacon 장치를 검색하세요 wx.startSearchBeacons({ 티켓:" ", //주변 비즈니스 티켓을 흔들면 흔들린 페이지 링크 후 시스템이 자동으로 추가합니다 complete:function(argv){ //검색 완료 후 콜백 기능 활성화 } }); 참고: 주변기기 흔들기 기능에 액세스해야 하는 경우 다음을 참조하세요. 주변기기 흔들기 활성화 적용 wx.stopSearchBeacons ({ complete:function(res){ //검색이 완료된 후 콜백 함수를 닫습니다 } }); wx.onSearchBeacons({ complete:function(argv){ //콜백 함수, 가능 배열 형식이어야 합니다. 판매자가 등록한 관련 주변 장치 목록을 가져옵니다 } }); Remarks: 위에 언급된 Shake Shake 주변 장치 인터페이스 사용 주의 사항 및 자세한 반환 결과 지침은 다음을 참조하십시오. Shake Shake 주변 장치를 사용하여 장치 정보 얻기 wx.hideOptionMenu(); w x.showOption메뉴 u() ; wx.closeWindow(); wx. hideMenuItems( { menuList: [] // 숨길 메뉴 항목은 "전파" 및 "보호" 버튼만 숨길 수 있습니다. 모든 메뉴 항목은 부록 3을 참조하세요 }); wx.showMenuItems({ ) menuList: [] // 표시할 메뉴 항목, 모든 메뉴 항목은 부록 3을 참조하세요 } wx.showAllNonBaseMenuItem(); wx.scanQRCode({ needResult: 0, // 기본값인 경우 0이면 스캔 결과가 WeChat에서 처리되고, 1이면 스캔 결과가 직접 반환됩니다. scanType: ["qrCode","barCode"], // QR 코드 스캔 여부를 지정할 수 있습니다. 또는 1D 코드이며 둘 다 기본적으로 사용 가능합니다. Success: function (res) { var result = res.resultStr; // needResult가 1이면 코드를 스캔하여 반환된 결과 } }); wx.openProductSpecificView({ productId: '', // 제품 ID viewType: '' // 0. 기본값, 일반 상품 상세 페이지 1. 상품 상세 페이지 스캔 2. 상품 상세 페이지 저장 }); WeChat 카드 및 티켓 인터페이스에 사용된 서명 인증서 api_ticket은 3단계의 구성에 사용된 서명 인증서 jsapi_ticket과 다릅니다. WeChat 카드 및 티켓 JS-SDK 호출 두 개의 서로 다른 서명을 순서대로 완료해야 하며 자격 증명을 캐시해야 합니다. api_ticket은 WeChat 카드 및 Voucher JS API를 호출하는 데 사용되는 임시 티켓이며 7200초 동안 유효하며 access_token을 통해 얻습니다. 개발자 참고 사항: 1.카드 및 쿠폰 인터페이스 서명에 사용되는 이 api_ticket은 3단계의 구성 인터페이스를 통해 권한 확인 구성을 주입하는 데 사용되는 jsapi_ticket과 다릅니다. 2. api_ticket을 얻기 위한 API 호출 수가 매우 제한되어 있으므로 api_ticket을 자주 새로 고치면 API 호출이 제한되고 개발자는 자체 서비스에 api_ticket을 저장하고 업데이트해야 합니다. 인터페이스 호출 요청 설명 http 요청 방법: GET https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type= wx_card 매개변수 설명 반환 데이터 데이터 예: { "errcode":0, "errmsg":"알았어", "티켓":"bxLdikRXVbTPdHSM05e5u5sUoXNKdvsdshFKA", "expires_in":7200 } 해당 카드 및 쿠폰 목록을 꺼내서 사용자 선택 정보를 얻으십시오. : '' , // 카드 및 쿠폰 유형 timestamp: 0, // 카드 및 쿠폰 서명 timestamp nonceStr: '', / / 카드와 쿠폰 서명은 무작위입니다 String signType: '', // 서명 방법, 기본값 'SHA1' cardSign: '', // 카드 서명 성공: function (res) { var cardList = res.cardList; // 사용자가 선택한 카드 목록 정보 } }); 개발자를 위한 특별 주의사항: 서명 오류로 인해 풀 카드 목록이 비정상적으로 비어 있게 됩니다. 서명과 관련된 매개변수의 유효성을 주의 깊게 확인하십시오. 특별 알림 풀 목록은 사용자의 로컬 쿠폰과만 관련되어 있습니다. 일반적으로 풀 목록이 비정상적으로 비어 있는 경우는 서명 오류, 잘못된 타임스탬프, 잘못된 필터링 메커니즘입니다. . 개발자는 위치 지정 이유를 순차적으로 조사해야 합니다. wx.addCard({ ) 카드 목록: [{ ] 카드I d: ', 카드 확장: '' }); 여기에서 카드_ext 매개변수는 서명에 참여하는 매개변수와 일치해야 하며 형식은 Object가 아닌 문자열이라는 점에 유의할 가치가 있습니다. 그렇지 않으면 서명 오류가 보고됩니다. 개발자는 한 번에 5개 이하의 카드를 추가하는 것이 좋습니다. 그렇지 않으면 시간 초과 오류가 발생합니다. WeChat 카드 패키지의 카드 및 쿠폰 인터페이스 보기 wx.openCard({ ) 카드 목록: [{ 카드 ID: '', 코드: '' }]// 개봉해야 하는 카드 및 쿠폰 목록 }); wx.chooseWXPay({ 타임스탬프: 0, // 결제 서명 타임스탬프, 참고 WeChat jssdk에서 사용되는 모든 타임스탬프 필드는 소문자입니다. 그러나 최신 버전의 결제 배경에서 서명을 생성하는 데 사용되는 타임스탬프 필드 이름은 S 문자 를 대문자로 사용해야 합니다. nonceStr: '', // 결제 서명 임의 문자열, 32비트 이하 package: '', // 통합 결제 인터페이스에서 반환된 prepay_id 매개변수 값, 제출 형식: prepay_id=***) signType: '', // 서명 방식, 기본값은 'SHA1', 새 버전의 결제를 사용하려면 'MD5'를 입력해야 합니다 paySign: '', // 결제 서명 성공: 함수(res) { }}) 참고: prepay_id는 WeChat Pay 통합 주문 인터페이스를 통해 획득됩니다. paySign은 통합 WeChat Pay 서명 생성 방법을 채택합니다. 여기서 appId는 구성에 전달된 appId와 일치해야 합니다. 서명과 관련된 마지막 매개변수인 appId, timeStamp, nonceStr, package, signType이 있습니다. WeChat 결제 개발 문서: https://pay.weixin.qq.com/wiki/doc/api/index.html Appendix 1-JS-SDK 사용 권한 서명 알고리즘 jsapi_ticket 서명을 생성하기 전에 jsapi_ticket을 먼저 이해해야 합니다. jsapi_ticket은 WeChat JS 인터페이스를 호출하기 위해 공용 계정에서 사용하는 임시 티켓입니다. 일반적인 상황에서 jsapi_ticket의 유효 기간은 7200초이며, 이는 access_token을 통해 획득됩니다. jsapi_ticket을 얻기 위한 API 호출 수가 매우 제한되어 있으므로 jsapi_ticket을 자주 새로 고치면 API 호출이 제한되고 비즈니스에 영향을 미칠 수 있습니다. 개발자는 자신의 서비스에서 전역적으로 jsapi_ticket을 캐시해야 합니다. 1. access_token을 얻으려면 다음 문서를 참조하십시오(유효성은 7200초이며 개발자는 자신의 서비스에서 전역적으로 access_token을 캐시해야 합니다). 첫 번째 단계 http GET을 사용하여 jsapi_ticket을 요청합니다(유효 기간 7200초, 개발자는 자신의 서비스에서 전역적으로 jsapi_ticket을 캐시해야 합니다 는 다음 JSON을 성공적으로 반환합니다. { "errcode":0, "errmsg":"ok", "티켓":" bxL dikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA ", "expires_in":7200 } jsapi_ticket을 얻은 후 JS-SDK 권한 확인을 위한 서명을 생성할 수 있습니다. 서명 알고리즘 서명 생성 규칙은 다음과 같습니다. 서명과 관련된 필드에는 noncestr(임의 문자열), 유효한 jsapi_ticket, timestamp(타임스탬프), url(현재 웹 페이지의 URL)이 포함됩니다. , 아니요 # 및 다음 부분을 포함합니다 ). 필드 이름의 ASCII 코드에 따라 서명할 모든 매개변수를 작은 것부터 큰 것까지(사전순) 정렬한 후 URL 키-값 쌍 형식(예: key1=value1&key2=value2...)을 사용하여 이를 하나의 매개변수로 연결합니다. 문자열 문자열1. 여기에서 모든 매개변수 이름은 소문자라는 점에 유의해야 합니다. string1에 대해 sha1 암호화를 수행하고, 필드 이름 및 필드 값에 원래 값을 사용하고, URL 이스케이프를 수행하지 마십시오. 은 서명=sha1(문자열1)입니다. 예: noncestr=Wm3WZYTPz0wzccnW jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhT dfl 2fzFy1AOcHKP7qg timestamp=1414587457 url=http://mp.weixin.qq.com?params=value 1단계. 필드 이름의 ASCII 코드에 따라 서명할 모든 매개변수를 작은 것부터 큰 것까지 정렬합니다(사전순). ), 그리고 URL을 사용합니다. 키-값 쌍(예: key1=value1&key2=value2...)의 형식은 문자열 string1로 이어집니다. y3-Sl-HhTdfl2fzFy1AO cHKP7qg&noncestr=Wm3WZYTPz0wzccnW×tamp= 1414587457&url=http://mp.weixin.qq.com?params =value 2단계. sha1로 string1에 서명하고 서명을 받습니다. 0f9de62fce790f9a083d5c99e95740ceb90c27ed Notes 1. 서명에 사용되는 noncestr 및 타임스탬프는 wx.config의 nonceStr 및 타임스탬프와 동일해야 합니다. 2. 서명에 사용되는 URL은 JS 인터페이스를 호출하는 페이지의 전체 URL이어야 합니다. 3.보안상의 이유로 개발자는 서버 측에서 서명 논리를 구현해야 합니다. 잘못된 서명 등의 오류가 발생하는 경우 일반적인 오류 및 해결 방법은 부록 5를 참조하세요. 버전 1.0.0 인터페이스 onMenuShareTimeline onMenuShareAppMessage onMenuShareQQ onMenuShareWeibo onMenuShareQZone startRecord stopRecord onVoiceRecordEnd playVoice onvoiceplayend uploadvoice downloadvoice chooseImage previewImage uploadimage downloadImage translateVoice getNetworkType openLocation getLocation hideOptionMenu showOptionMenu hideMenuItems showMenuItems hideAllNonBaseMenuItem showAllNonBaseMenuItem closeWindow scanQRCode chooseWXPay openProductSpecificView addCard chooseCard openCard 주간 모드: "menuItem:dayMode"야간 모드: "menuItem:nightMode" Refresh: "menuItem:refresh" 공식 계정 보기(추가됨): "menuItem:profile" 공식 계정 보기(추가되지 않음): "menuItem:addContact" 커뮤니케이션 카테고리 친구에게 보내기 : "menuItem:share:appMessage" 순간에 공유: "menuItem:share:timeline" QQ에 공유: "menuItem:share:qq" Weibo에 공유: "menuItem:share :웨이보앱" 수집: "menuItem:favorite" FB에 공유: "menuItem:share:facebook" QQ space/menuItem:share에 공유:QZone 보호 카테고리 태그 편집: "menuItem:editTag" 삭제: "menuItem:delete" 링크 복사: "menuItem:copyUrl" 원본 페이지: "menuItem:originPage" 읽기 모드: "menuItem:readMode" QQ 브라우저에서 열기: "menuItem:openWithQQBrowser" Safari에서 열기: "menuItem:openWithSafari" Mail: "menuItem:share :email" 특수 공개 계정: "menuItem:share:brand" Appendix 4 - 카드 및 쿠폰 확장 필드 및 서명 생성 알고리즘 JSSDK 사용자는 여기를 읽어주세요. JSAPI 사용자는 카드 및 쿠폰 서명과 JSSDK 서명은 완전히 독립적입니다. 둘의 알고리즘과 의미는 완전히 다릅니다. JSSDK의 서명은 모든 JS 인터페이스를 사용하는 데 필요한 인증 계층으로 발신자의 신원을 식별하는 데 사용되며 쿠폰 자체와는 아무런 관련이 없습니다. 둘째, 카드와 쿠폰의 서명을 위해 프로토콜의 확장성과 간단한 데이터 변조 방지를 고려하여 일련의 독립적인 서명 프로토콜을 설계했습니다. 또한, 역사적인 이유로 인해 카드와 쿠폰의 JS 인터페이스는 JSSDK 이전에 등장했습니다. 당시 JSAPI에는 인증 시스템이 없었기 때문에 카드 서명에 신원 정보 appsecret/api_ticket도 추가되었습니다. 쿠폰. 개발자가 이해해 주기를 바랍니다. 카드 및 쿠폰 api_ticket 카드 및 쿠폰 api_ticket은 카드 및 쿠폰 관련 인터페이스를 호출하는 데 사용되는 임시 티켓이며 access_token을 통해 획득됩니다. jsapi_ticket과 구별하려면 여기에 주의하세요. 카드와 티켓 api_ticket을 얻기 위한 API 호출 수가 매우 제한되어 있으므로 카드와 티켓 api_ticket을 자주 새로 고치면 API 호출이 제한되고 자체 비즈니스에 영향을 미칩니다. 개발자는 카드와 티켓 api_ticket을 자체적으로 전역적으로 캐시해야 합니다. 서비스 . 1 access_token을 얻으려면 다음 문서를 참조하세요(유효 기간 7200초, 개발자는 자체 서비스에서 전역적으로 access_token을 캐시해야 합니다): ../15/54ce45d8d30b6bf6758f68d2e95bc627.html 2. 첫 번째 단계에서 얻은 access_token을 사용하여 http GET 방식으로 카드 및 쿠폰 api_ticket을 요청합니다. (유효 기간은 7200초이며 개발자는 자체 서비스에서 전역적으로 카드 및 쿠폰 api_ticket을 캐시해야 합니다): https:/ /api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=wx_card 카드 및 쿠폰 확장 필드 cardExt 설명 cardExt 자체는 JSON 문자열입니다. , 이는 판매자가 수행하는 작업입니다. 다음 필드를 포함하여 각 카드 및 쿠폰에 할당된 고유 정보: 서명 지침 1. api_ticket은 appsecret보다 안전하며 이전 버전의 문서에서 서명 인증서로 사용되는 appsecret, timestamp, card_id, code, openid 및 nonce_str 값 값과 호환되어 문자열을 사전순으로 정렬합니다. 2. 모든 매개변수 문자열을 하나의 문자열로 연결하고 sha1 암호화를 수행하여 서명을 받습니다. 3. 서명의 타임스탬프 및 nonce 필드는 카드_ext의 타임스탬프 및 nonce_str 필드와 일치해야 합니다. 에디토리얼 73y7h4jJE, nonce_str=jonyqin, 서명=sha1(1404896688jonyqinjonyqin_1434008071ojZ8YtyVyr30HheH3CM73y7h4jJE pjZ8Yt1XGILfi-FusewpnnolGgZk) = 6b81fbf6af16e856334153b39737556063c82689. 개발자는 카드 및 쿠폰 정보 패키지에 있는 서명 도구 SDK를 사용하여 서명하거나 확인을 위한 디버그 도구를 사용할 것을 적극 권장합니다: http://mp.weixin.qq.com/debug/cgi -Bin/Sandbox? T = Cardsign 님 Signature Cardsign 지시 사항 1. 버전 문서) appsecret을 서명 인증서로 사용합니다.), app_id, location_id, times_tamp, nonce_str, card_id, card_type 값을 사용하여 문자열을 사전순으로 정렬합니다. 2. 모든 매개변수 문자열을 하나의 문자열로 연결하고 sha1 암호화를 수행하여 카드사인을 얻습니다. #🎜 🎜 # 구성 인터페이스를 호출할 때 debug: true 매개변수를 전달하여 디버그 모드를 활성화하면 페이지에 오류 메시지가 표시됩니다. 다음은 일반적인 오류 및 해결 방법입니다. 1. 잘못된 URL 도메인 현재 페이지의 도메인 이름이 사용된 앱 ID에 바인딩되어 있지 않은지 확인하세요. 포트 이름은 80(http), 443(https) 2개만 지원하므로 포트 번호를 입력할 필요가 없습니다. 하나의 appid는 3개의 유효한 도메인 이름에 바인딩될 수 있습니다. 2. 잘못된 서명 서명 오류입니다. 다음 순서로 확인하는 것을 권장합니다. 1. 서명 알고리즘이 올바른지 확인하세요. http://mp.weixin.qq.com/debug에서 확인하실 수 있습니다. /cgi-bin/sandbox?t=jsapi확인을 위한 페이지 도구입니다. 2. 구성의 nonceStr(js의 표준 낙타 대문자 S) 및 타임스탬프가 서명에 사용된 해당 noncestr 및 타임스탬프와 일치하는지 확인합니다. 3. URL이 'http(s)://를 포함하여 페이지의 전체 URL인지 확인합니다. (현재 페이지에서 확인하세요. Alert(location.href.split('#')[0])) ' 부분, 그리고 '? '' 뒤에 GET 매개변수 부분이 있지만, '#' 해시 다음 부분은 포함되지 않습니다. 4. 구성의 appid가 jsapi_ticket을 얻는 데 사용된 appid와 일치하는지 확인합니다. 5. access_token 및 jsapi_ticket을 캐시해야 합니다. 6.서명을 위해 얻은 URL이 동적으로 얻어졌는지 확인하세요. 동적 페이지의 경우 예제 코드의 PHP 구현을 참조하세요. html의 정적 페이지인 경우 프런트 엔드에서 ajax를 통해 서명을 위해 URL이 백엔드로 전달됩니다. 프런트 엔드에서는 '#' 해시 부분을 제외하고 현재 페이지의 링크를 가져오기 위해 js를 사용해야 합니다. location.href.split('#')[0]에서 가져오고 encodeURIComponent가 필요함). 페이지가 공유되면 WeChat 클라이언트는 현재 링크를 얻지 못한 경우 링크 끝에 다른 매개변수를 추가하기 때문입니다. 동적으로 공유 페이지의 서명이 실패합니다. 3.권한 값이 오프라인 확인 중입니다. 이 오류는 구성이 올바르게 실행되지 않았거나 호출 중인 JSAPI가 구성의 jsApiList 매개 변수로 전달되지 않았기 때문에 발생합니다. 다음 순서로 확인하시는 것을 권장합니다. 1. 구성이 올바르게 전달되었는지 확인합니다. 2. 페이지 로드 시 JSAPI가 호출되는 경우 wx.ready의 콜백에 작성해야 합니다. 3. config의 jsApiList 매개변수에 이 JSAPI가 포함되어 있는지 확인합니다. 4.permission 거부됨 공식 계정에 이 JSAPI를 사용할 수 있는 권한이 없거나 호출 중인 JSAPI가 config의 jsApiList 매개변수로 전달되지 않습니다(일부 인터페이스는 사용하기 전에 인증이 필요함). 5. 기능이 존재하지 않습니다. 현재 클라이언트 버전은 이 인터페이스를 지원하지 않습니다. 이를 경험하려면 새 버전으로 업그레이드하세요. 6. config: 버전 6.0.1에서는 괜찮지만 6.0.2 버전 이후에는 안 되는 이유(6.0.2 버전 이전에는 권한 확인이 없기 때문에 config는 모두 괜찮지만, 그렇다고 해서 그렇지는 않습니다) 구성에 서명이 정상인지 확인하세요. 상위 버전에서 구성이 괜찮은지 확인하려면 6.0.2에서 올바른 서명이 생성되었는지 확인하세요) 7. iOS, Android에서는 공유가 불가능합니다. (공식 계정이 인증되었는지 확인해주세요. 인증된 공식 계정만이 관련 인터페이스 공유 권한을 가집니다. 실제로 인증된 경우, 리스닝 인터페이스가 실행되는지 확인하세요. wx.ready 콜백 함수 ) 8. 서비스가 온라인 상태가 된 후에는 jsapi_ticket을 직접 얻을 수 없습니다. (access_token과 jsapi_ticket은 자체 서버에 캐시해야 하기 때문에 그렇지 않으면 온라인 접속 후 빈도 제한이 발생합니다. 서버 요청 2개를 줄이려면 토큰과 티켓을 꼭 캐시하세요. 이렇게 하면 빈도 제한이 발생하는 것을 피할 수 있을 뿐만 아니라, 또한 자체 서비스 속도를 높이세요. 현재 테스트 편의를 위해 10,000개 획득이 제공됩니다. 임계값을 초과하면 서비스를 더 이상 사용할 수 없습니다. 서비스가 온라인 상태가 되기 전에 access_token 및 jsapi_ticket이 전역적으로 캐시되어 있는지 확인하세요. . 둘 다 7200초 동안 유효합니다. 그렇지 않으면 온라인 상태가 되면 실행됩니다. 주파수 제한으로 인해 서비스를 더 이상 사용할 수 없습니다 ). 9. uploadImage를 사용하여 여러 이미지를 업로드하는 방법(현재는 한 번에 하나의 이미지 업로드만 지원합니다. 여러 이미지의 경우 이 인터페이스를 호출하기 전에 이전 이미지가 업로드될 때까지 기다려야 합니다) 10. 로컬로 선택한 이미지를 업로드할 수 없습니다. (choiceImage 인터페이스 자체가 미리보기를 지원하므로 추가 지원이 필요하지 않습니다.) 11. 링크 a를 통해 링크 B로 이동(예: WeChat을 통해 먼저 로그인 인증), 유효하지 않은 서명 실패(백그라운드에서 서명을 생성하는 링크는 점프 후의 링크 b인 jssdk를 사용하는 현재 링크입니다. , 사용하지 마십시오) WeChat 로그인을 위한 승인된 링크는 서명 계산에 사용됩니다. 백그라운드 서명 URL은 '#' 부분을 뺀 jssdk의 전체 URL이어야 합니다.) 12. 실패 오류가 발생합니다(전달된 구성 매개변수가 불완전하기 때문입니다). 원인, 사용할 올바른 appId, timestamp, nonceStr, 서명 및 jsApiList를 전달했는지 확인하십시오. 13. jsapi가 자신의 서버에 WeChat에 업로드했습니다(문서 참고 사항의 uploadVoice 및 uploadImage 인터페이스를 참조하세요) 14. Android는 jssdk를 통해 WeChat 서버에 업로드되고 제3자가 WeChat에서 자체 서버로 다운로드합니다. 서버에 소음이 발생합니다(WeChat 팀이 이 문제를 해결했으며 이제 백엔드가 최적화되어 온라인 상태가 되었습니다) 15. 상위 도메인 이름을 바인딩하고 해당 하위 도메인 이름도 사용 가능한지 확인합니다(예, 합법적인 하위 도메인 이름이 있습니다. 상위 도메인 이름 바인딩 후 완벽하게 지원됨) 16. iOS WeChat 버전 6.1에서는 공유된 사진의 외부 링크가 표시되지 않습니다. 공식 계정 페이지 내에서 링크된 사진이나 WeChat 서버의 사진만 표시될 수 있습니다. 6.2 17. 링크를 업데이트해야 하나요? 자체 버전을 호환되게 만드세요(jssdk는 하위 버전과 호환되며 제3자가 추가 작업을 수행하도록 요구하지 않지만 일부 인터페이스는 6.0.2에서 새로 도입되어 호출만 가능함). 18. 공개 결제 서명이 유효하지 않아 거래를 시작할 수 없습니다. (사용 중인 jweixin.js가 공식 온라인 버전인지 확인하세요. 사용자 트래픽을 줄일 수 있을 뿐만 아니라 또한 특정 버그를 수정하고 타사 서버에 복사하여 사용합니다. 공식 발생하는 모든 문제에 대해 보증을 제공하지 않습니다.) 19. 현재 Android WeChat 클라이언트는 pushState의 새로운 H5 기능을 지원하지 않습니다. 따라서 pushState를 사용하여 웹 앱 페이지를 구현하면 서명이 실패하게 됩니다. 이 문제는 Android 6.2에서 수정되었습니다. 20. 때때로 Android는 chooseImage의 콜백에서 uploadImage를 실행하지 않습니다. 이 문제를 해결하려면, uploadImage 호출을 setTimeout에 넣고 100ms 정도 지연하면 됩니다. .require subscribe 오류는 테스트 계정을 구독하지 않았음을 나타냅니다. 테스트 계정에만 표시됩니다 22. getLocation이 GPS 좌표를 반환하기 때문에 getLocation에서 반환된 좌표는 편향되어 있으며, openLocation에서 열린 Tencent 지도는 화성 좌표이므로 버전 6.2부터 화성 좌표를 직접 획득할 수 있습니다. 지원되었습니다 23. 공식 계정 보기(추가되지 않음): "menuItem:addContact"가 표시되지 않습니다. 현재 공식 계정에서 퍼진 링크만 표시될 수 있습니다. 출처는 공식 계정이어야 합니다. 24. ICP 파일링 데이터 동기화가 하루 지연되므로 둘째 날에 바인딩해 주세요 DEMO 페이지: http://demo.open.weixin.qq.com/jssdk 샘플 코드: http://demo.open.weixin.qq.com/jssdk/sample.zip 참고: 링크에는 php, java, nodejs 및 python이 포함되어 있습니다. 샘플 코드는 제3자 참조용입니다. 제3자는 획득한 액세스 토큰과 jsapi_ticket을 캐시하여 빈도 제한이 실행되지 않도록 해야 합니다. 이메일 주소: weixin-open@qq.com 이메일 제목: [WeChat JS-SDK 피드백] 이메일 내용 설명: 문제를 간결한 언어로 설명하고, 문제가 발생한 시나리오를 명확하게 설명하세요. 스크린샷을 첨부할 수 있습니다. WeChat 팀 피드백은 가능한 한 빨리 처리될 것입니다. 매개변수 필요한가요 설명 access_token 은 입니다 인터페이스 호출 자격 증명 매개변수 이름 Description errcode 오류 코드 errmsg 오류 메시지 티켓 api_ticket, 카드 로그인에 필요한 인증서 및 쿠폰 인터페이스 expires_in 유효 시간 매개변수 이름 필수 type 값 예시 Description shopId No string(24) 1234 스토어아이디. shopID는 필수는 아니지만 지정된 location_list(shopID)를 사용하여 쿠폰 목록을 필터링하고 가져오는 데 사용됩니다. cardType No string(24) GROUPON 카드 유형, 지정된 카드 유형의 카드 목록을 불러오는 데 사용됩니다. CardType이 비어 있으면 기본적으로 모든 카드 및 쿠폰 목록이 표시되지만 이는 필수 사항이 아닙니다. cardId No string(32) p1Pj9jr90_SQRaVqYI239Ka1erk 카드 ID, 지정된 카드 ID의 카드 목록을 가져오는 데 사용됩니다. 비어 있으면 기본적으로 모든 카드 및 쿠폰 목록이 표시되며 이는 필수 사항이 아닙니다. timestamp 은 string(32) 14300000000 타임스탬프입니다. nonceStr 은 string(32) sduhi123 임의 문자열입니다. 만 지원합니다. signType 은 string(32) SHA1 서명 메서드이며 현재 SHA1 cardSign 은 입니다 string(64) abcsdijcous123 서명되었습니다. Field 필수인가요? 서명 참여 여부 지침 code No 은 에서 지정한 쿠폰 코드로, 한 번만 수집할 수 있습니다. 커스텀 코드 모드의 카드, 쿠폰은 반드시 입력해야 하며, 비커스텀 코드 모드와 사전 저장된 코드 모드의 카드, 쿠폰은 입력할 필요가 없습니다. 자세한 내용은 다음을 참조하세요. 코드 맞춤 설정 여부 openid 아니요 는 지정된 수신자의 openid가 이며, 이 사용자만 받을 수 있습니다. bind_openid 필드가 true인 카드 및 쿠폰은 반드시 입력해야 하며, bind_openid 필드는 false이므로 입력할 필요가 없습니다. timestamp 은 은 타임스탬프입니다. 판매자는 1970년 1월 1일 00:00:00부터 현재까지의 초 수(초)를 생성합니다. , 마지막으로 판매자가 생성하여 전달하는 문자열 형식으로 변환해야 합니다. 다른 추가 요청의 타임스탬프가 반복되면 수집이 실패합니다. . nonce_str No 은 개발자가 설정한 임의 문자열입니다. 보안 강화(입력하지 않으면 요청이 재생될 수 있음). 32자 이하의 임의 문자열입니다. 다른 추가 요청에 대해서는 대문자, 소문자 및 숫자를 사용하는 것이 좋습니다. 반복되면 수집이 실패합니다.아니요 🎜🎜# No쿠폰 교환 시간은 10자리 타임스탬프입니다. 카드 및 쿠폰의 유효기간 종류가 DAT E_TYPE_FIX_TERM인 경우에만 사용되며, 카드 및 쿠폰의 실제 유효기간을 식별하며, 카드 및 쿠폰의 유효기간이 만료되는 문제를 해결하는데 사용됩니다. 판매자 시스템의 시작 시간과 수집 시간 간의 동기화. outer_id #🎜🎜 #아니요 No 수신 채널 매개변수는 이 수신에 대한 채널 값을 식별하는 데 사용됩니다. signature 은 - 서명 방식으로 인터페이스 목록의 매개변수에 서명합니다. 특정 서명 체계는 다음과 같습니다. 판매자가 사양에 따라 서명한 후 전달합니다.