android 위챗 권한 수여, 공유, 지불의 구덩이 - 밟을 수 없는 구덩이 기념

8760 단어 android 자습서
위챗에서 공유한 데모가 업데이트되었습니다. 예전의 구덩이가 없는 것 같습니다. 데모를 먼저 고친 다음에 여는 것이 좋습니다.
1. 쓸모없는 파일을 삭제하지 않으면 오류 보고: Error: Unknown host'android.oa.com'. You may need to adjust the proxy settings in Gradle, 4개: 전체 app 디렉터리,build.gradle、debug.keystore、settings.gradle
2.sdk 버전,build tools 버전
 
위챗 결제가 서명을 생성하는 가장 좋은 백엔드 계산이다. 그렇지 않으면 다른 사람이 가방을 해독하면 gg가 된다.
 
위에 구덩이 밟은 거 있으면 아래로 나눠주세요. 감사합니다. 본인이 쓰는 우맹이라 안 밟았어요.
 
갱1: 공유하거나 지불하려면 지정Activity의 갱을 만들어야 합니다. 이 갱 위챗은 당신에게 알려주지 않습니다.
공유하거나 지불할 때 프로젝트 디렉터리에wxapi>WXEntryActivity 또는 WXPayEntryActivity를 만들어야 하며 IWXAPIEventHandler 인터페이스를 실현해야 합니다.이렇게 하면 결합성이 비교적 높은 문제를 일으키고 다른 인터페이스의 공유나 지불 논리가 다른 상황에서 다음과 같은 코드가 나타난다.
    public static int AAA = 0;
    @Override
    public void onResp(BaseResp resp) {
        switch (AAA){
            case 1:
                //a  
                break;
            case 2:
                //b  
                break;
            case 3:
                //c  
                break;
            //...n  
            default:
                break;
        }
    }

그리고 AAA의 값을 동적으로 바꾸면 Activity가 난잡할 뿐만 아니라 유지하기도 어렵다. 만약에 주석이 뚜렷하지 않으면 이곳의 코드는 천서와 같다.이렇게 수정하는 것을 건의합니다
    private static OnWXListener mListener = null;
    private static WeakReference mActivity = null;
    public static final int DEFAULT_WXTIME = 300;
    private static int mTime = DEFAULT_WXTIME;
    private static OnCancelClickListener mTimeListener = null;

    @Override
    public void onReq(BaseReq req) {
        if (mListener != null) {
            mListener.onReq(req);
            mListener = null;
        }
        finish();
    }

    @Override
    public void finish() {
        api.detach();//     ,  wx       (  :“       ”)
        super.finish();
    }

    @Override
    public void onResp(BaseResp resp) {
        if (mListener != null) {
            mListener.onResp(resp);
            mListener = null;
        }
        finish();
    }

    public static void setResultListener(Activity activity, WXEntryActivity.OnWXListener listener) {
        if (mListener != null) {
            mListener.onError(WXEntryActivity.OnWXListener.TYPE_REPLACE, "    !", null);
        }
        mActivity = new WeakReference<>(activity);
        mListener = listener;
        if (mTimeListener == null) {
            mTimeListener = new OnCancelClickListener() {
                @Override
                public void clickCancel(Void aVoid) {
                    mTime--;
                    Activity ac = mActivity.get();
                    if (ac == null || ac.isFinishing()) {
                        clear();
                    }
                    if (mTime < 0) {
                        if (mListener != null) {
                            mListener.onError(WXEntryActivity.OnWXListener.TYPE_TIMEOUT, "    !", null);
                        }
                        clear();
                    }
                }

                void clear() {
                    TimeUtil.removeTimeListener(this);//    
                    mActivity = null;
                    mListener = null;
                    mTime = WXEntryActivity.DEFAULT_WXTIME;
                }
            };
        }
        mTime = WXEntryActivity.DEFAULT_WXTIME;
        TimeUtil.addTimeListener(mTimeListener);//    1      handler
    }
    /**
     *        ,          
     */
    public static void WXPay(Activity activity, WXCode wc/*         */, OnWXListener listener) {
        setResultListener(activity, listener);
        // Application       ...       detach  
        IWXAPI api = WXAPIFactory.createWXAPI(activity, wc.appid);//finish   detach  ,          
        api.registerApp(wc.appid);
        if (!api.isWXAppInstalled()) {
            Utils.toast("         !");
        }
        PayReq request = new PayReq();
        request.appId = wc.appid;
        request.partnerId = wc.mch_id;
        request.prepayId = wc.prepay_id;
        request.packageValue = "Sign=WXPay";//   ,      ,      
        request.nonceStr = wc.nonce_str;
        request.timeStamp = String.valueOf(wc.timestamp);
        request.sign = wc.paySign;
        api.sendReq(request);
    }

    public static abstract class OnWXListener {
        //    :    ;               ;     
        public static final int TYPE_TIMEOUT = 0, TYPE_REPLACE = 1, TYPE_WX = 2;

        @IntDef({TYPE_TIMEOUT, TYPE_REPLACE, TYPE_WX})
        @Retention(RetentionPolicy.SOURCE)
        public @interface type {
        }//           ,     

        //     app
        public void onReq(BaseReq req) {
        }

        /**
         * app      ,   resp     ,      {@link #onWXSuccess}{@link #onError}
         */
        public void onResp(BaseResp resp) {
            switch (resp.errCode) {
                case BaseResp.ErrCode.ERR_OK:
                    onWXSuccess(resp);
                    break;
                case BaseResp.ErrCode.ERR_COMM:
                    onError(TYPE_WX, "    !", resp);
                    break;
                case BaseResp.ErrCode.ERR_USER_CANCEL:
                    onError(TYPE_WX, "    !", resp);
                    break;
                case BaseResp.ErrCode.ERR_SENT_FAILED:
                    onError(TYPE_WX, "    !", resp);
                    break;
                case BaseResp.ErrCode.ERR_AUTH_DENIED:
                    onError(TYPE_WX, "      !", resp);
                    break;
                case BaseResp.ErrCode.ERR_UNSUPPORT:
                    onError(TYPE_WX, "       !", resp);
                    break;
                case BaseResp.ErrCode.ERR_BAN:
                    onError(TYPE_WX, "     !", resp);
                    break;
                default:
                    onError(TYPE_WX, "      !", resp);
                    break;
            }
        }

        public abstract void onWXSuccess(BaseResp resp);

        /**
         * @param errType      :  、  、    
         * @param errorMsg     
         * @param resp                 null
         */
        public abstract void onError(@type int errType, String errorMsg, @Nullable BaseResp resp);
    }

이것은 WXPay Entry Activity의 예입니다. WXPay Entry Activity만 호출하면 됩니다.WXPay 방법은 지정된 매개 변수와 리셋을 전송하면 되고 공유도 참고할 수 있습니다
이렇게 사용하면 매우 편리하다. 아래와 같다.
        WXPayEntryActivity.WXPay(this, wc, new WXEntryActivity.OnWXListener() {
            @Override
            public void onWXSuccess(BaseResp resp) {
                Utils.toast("    ");
            }

            @Override
            public void onError(int errType, String errorMsg, @Nullable BaseResp resp) {
                Utils.toast(errorMsg);
            }
        });

GitHub 참조:https://github.com/weimingjue/WXEntry
갱2: 지불에 성공하고 계속 실패하면 위챗도 알려주지 않을 거야.
위챗 전설의 데모에 따라 돈을 모으면 와세가 한꺼번에 케이슨을 끌어올리고 즐겁게 테스트를 보낸다.2분 후에 피드백을 테스트해서 지불할 수 없습니다. 그리고 다시 시도해 보세요. 왜 모두 통신에 실패하고 어리둥절한 얼굴인지...
이유는 간단하다. 설정이 맞지 않았습니다. 위챗 오픈 플랫폼의 설정을 확인하십시오.
왜 처음으로 성공할 수 있습니까?비교 구덩이 때문 (여전히 캐시 문제로 추측된다. 첫 번째로 결제를 당기면 캐시가 없다. 위챗은 성공한 것으로 생각하고 두 번째 캐시가 생겼다. 위챗은 네 앱의 키 가방 이름이 틀렸다는 것을 발견하고 바로 이상을 던졌다)
갱3: 오픈 플랫폼의 서명 문제, 위챗: 난 말 안 해, 난 말 안 해.
서명은 깊은 구덩이입니다. 서명 양식이 정확한지 여러 번 확인하십시오. 정확한 양식은 MD5이고 사칭이 없습니다. (사칭이 없습니다! 사칭이 없습니다!)대소문자를 구분하지 않습니다.
만약 서명이 SHA1이라고 쓰여 있다면 재작성을 축하합니다.
만약 직접 코피 서명으로 계산된 MD5값이 있다면 축하합니다. 계산된 것은 기본적으로 사칭이 있습니다.
내용이 정확한지 확인했다면 아래를 보세요.
 
갱4: 위챗 캐시의 큰 갱, 위챗은 더 이상 너에게 알려줄 수 없어.
만약 당신의 서명이나 가방 이름을 잘못 썼고, 완전히 수정된 후에도 권한을 부여받지 못하거나 한 번 지불한 후에 항상 통신 실패를 알린다면, 입갱을 축하합니다.
원인: 당신이 변경한 데이터는 바로 위챗 서버에 저장되었지만, 위챗 앱 측은 첫 번째 권한을 부여받을 때 서명을 로컬에 저장합니다. 이 핸드폰은 첫 번째 권한을 부여받았는데 잘못된 서명을 받았습니다. 그 다음에 권한을 부여하는 것은 똑같습니다.
해결 방법은 크게 다음과 같다.로그인을 종료하고 다시 로그인하기;2. 위챗 캐시를 제거한다(데이터를 제거하는 것이 아니다).3. 상기 두 가지가 모두 안 되면 데이터를 지우거나 다시 설치를 해제한다(사용자가 조작한 후에 요괴령이 그리워지지 않을지 모르겠다);4. 운명에 맡기고 위챗의 캐시 리셋을 기다린다(하루 안에 리셋한다)
갱5:심연거갱
만약 당신의 연결이 완전히 정확하고 지불에 성공했지만 아무리 해도 위챗의 회전 리셋을 받지 못한다면, 역사상 가장 구덩이인 아버지의 api천구덩이에 빠진 것을 축하합니다.
먼저 위챗/결제의 원리(혈액주머니 준비): 매개 변수>startActivity위챗 지정 인터페이스>위챗 인터페이스 공유/결제 완료>startActivityWXEntryActivity/WXPayEntryActivity로 이동...얼마나 좋은 API인데 생각이 간단명료하고 폭력적이야?
만약 응용 프로그램 Id와 패키지 경로가 일치하지 않는다면, 예를 들어com.wang.응용 프로그램과com.wang.package, 위챗에서 getPackageName () 을 호출할 때com을 받을 수 있습니다.wang.응용 프로그램(이곳에서 왜, 자기bd를 더 이상 말하지 않음), 돌아오는Activity는com입니다.wang.application.wxapi.WXEntryActivity, 당신의Activity와 전혀 맞지 않습니다. 당연히 되돌릴 수 없습니다.
이 문제는 3가지 해결 방안이 있다. 1.패키지 경로 이름 바꾸기 (다중 항목 불가)
2. 응용 프로그램 Id와 일치하는 폴더를 만들어서 WXEntryActivity를 놓는다(한두 개는 해결하기 쉽다)
3.gradle이나 apt를 사용하여 대응하는 경로 아래의Activity를 자동으로 생성합니다(최고의 해결 방안이지만...?)

좋은 웹페이지 즐겨찾기