微信/支付寶 第三方支付相關(guān)

支付寶

  • 無客戶端時娜扇,可調(diào)用網(wǎng)頁支付
 <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
 </activity>
  • 支付結(jié)果
 public class AliPayResult  {
    private String resultStatus;
    private String result;
    private String memo;

    public AliPayResult(Map<String, String> rawResult) {
        if (rawResult == null) {
            return;
        }

        for (String key : rawResult.keySet()) {
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo
                + "};result={" + result + "}";
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }
}
  • 發(fā)起支付
public class AliPayUtils {
    private static AliPayUtils aliPayUtils = null;

    private AliPayUtils(){

    }

    public static AliPayUtils getInstance(){
        if (aliPayUtils == null)
            aliPayUtils = new AliPayUtils();
        return aliPayUtils;
    }

    public void alipay_v2(final String orderInfo, final IPayCallback callback){
        new RxJavaUtils<String>().handleDataByThread(new RxScheduler<String>() {
            @Override
            public String doInThread() {
                PayTask alipay = new PayTask(ThirdPayUtils.mActivity);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());
                AliPayResult payResult = new AliPayResult(result);
                String resultInfo = payResult.getResult();// 同步返回需要驗證的信息
                String resultStatus = payResult.getResultStatus();
                return resultStatus;
            }

            @Override
            public void doInUI(String resultCode) {
                if(callback != null)
                    callback.onResult(resultCode);
            }
        });
    }
}

微信

  • 回調(diào)接收類 (包名目錄下wxapi.WXPayEntryActivity)
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
    private static final String TAG = WXPayEntryActivity.class.getSimpleName();
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, "wx4f6d2f117e3724ec");
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {
    }

    @Override
    public void onResp(BaseResp baseResp) {
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            L.i("onResp:" + baseResp.errCode);
            if (ThirdPayUtils.mCallbackContext != null && ThirdPayUtils.mWxPayResp != null) {
                try {
                    JSONObject respJson = new JSONObject();
                    respJson.put("resultCode", String.valueOf(baseResp.errCode));
                    respJson.put("payType", ThirdPayUtils.mWxPayResp.payType);
                    respJson.put("orderId", ThirdPayUtils.mWxPayResp.orderId);
                    respJson.put("tradeNo", ThirdPayUtils.mWxPayResp.tradeNo);
                    L.i(TAG, "wxPay callback--->" + respJson.toString());
                    ThirdPayUtils.mCallbackContext.success(respJson);
                    ThirdPayUtils.mWxPayResp = null;
                    ThirdPayUtils.mCallbackContext = null;
                    finish();
                } catch (JSONException e) {

                }
            }
        }
    }
}
  • 清單配置
 <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:theme="@style/AppStartLoadTheme"
            android:exported="true"
            android:launchMode="singleTop" />

<activity-alias
            android:name="${applicationId}.wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:targetActivity=".wxapi.WXPayEntryActivity"/>
  • 發(fā)起支付
// 從服務(wù)器獲取加密后的相關(guān)支付參數(shù)
JSONObject aliPayJson = args.getJSONObject(0);
                L.i(TAG, "aliPayJson:" + aliPayJson);
                final String payType = aliPayJson.getString("payType");
                final String orderId = aliPayJson.getString("orderId");
                final String tradeNo = aliPayJson.getString("tradeNo");
                String orderInfo = aliPayJson.getString("sign");
                AliPayUtils.getInstance().alipay_v2(orderInfo, new IPayCallback() {
                    @Override
                    public void onResult(String resultCode) {
                        try {
                            JSONObject respJson = new JSONObject();
                            respJson.put("resultCode", resultCode);
                            respJson.put("payType", payType);
                            respJson.put("orderId", orderId);
                            respJson.put("tradeNo", tradeNo);
                            L.i(TAG, "aliPay callback--->" + respJson.toString());
                            //回調(diào)給頁面
                            callbackContext.success(respJson);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
  • 支付工具類
public class WXPayUtils {
    private IWXAPI iwxapi; //微信支付api

    private WXPayBuilder builder;

    private WXPayUtils(WXPayBuilder builder) {
        this.builder = builder;
    }

    /**
     * 調(diào)起微信支付的方法,不需要在客戶端簽名
     **/
    public void toWXPayNotSign(Context context, String appid) {
        iwxapi = WXAPIFactory.createWXAPI(context, null); //初始化微信api
        iwxapi.registerApp(appid); //注冊appid  appid可以在開發(fā)平臺獲取

       if (!isInstallWx(context))
           return;

        Runnable payRunnable = new Runnable() {  //這里注意要放在子線程
            @Override
            public void run() {
                PayReq request = new PayReq(); //調(diào)起微信APP的對象
                //下面是設(shè)置必要的參數(shù)瓶蚂,也就是前面說的參數(shù),這幾個參數(shù)從何而來請看上面說明
                request.appId = builder.getAppId();
                request.partnerId = builder.getPartnerId();
                request.prepayId = builder.getPrepayId();
                request.packageValue = builder.getPackageValue();
                request.nonceStr = builder.getNonceStr();
                request.timeStamp = builder.getTimeStamp();
                request.sign = builder.getSign();
                L.i("MyPlugin", "wxPay sendReq--->appid:" + request.appId +
                        " nonceStr:" + request.nonceStr + " sign:" + request.sign);
                iwxapi.sendReq(request);//發(fā)送調(diào)起微信的請求
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    /**
     * 調(diào)起微信支付的方法,需要在客戶端簽名
     **/
    public void toWXPayAndSign(Context context, String appid,final String key) {
        iwxapi = WXAPIFactory.createWXAPI(context, null); //初始化微信api
        iwxapi.registerApp(appid); //注冊appid  appid可以在開發(fā)平臺獲取

        if (!isInstallWx(context))
            return;

        Runnable payRunnable = new Runnable() {  //這里注意要放在子線程
            @Override
            public void run() {
                if (TextUtils.isEmpty(builder.getAppId())
                        ||TextUtils.isEmpty(builder.getPartnerId())
                        ||TextUtils.isEmpty(builder.getPrepayId())){
                    Log.e("chx", "toWXPayAndSign: "+"必須在builder中設(shè)置appId、PartnerId、PrepayId");
                    return;
                }
                PayReq request = new PayReq(); //調(diào)起微信APP的對象
                //下面是設(shè)置必要的參數(shù)痘煤,也就是前面說的參數(shù),這幾個參數(shù)從何而來請看上面說明
                request.appId = builder.getAppId();
                request.partnerId = builder.getPartnerId();
                request.prepayId = builder.getPrepayId();
                request.packageValue = "Sign=WXPay";
                request.nonceStr = genNonceStr();
                request.timeStamp = String.valueOf(genTimeStamp());
                request.sign = builder.getSign();
                //簽名
                LinkedHashMap<String, String> signParams = new LinkedHashMap<>();
                signParams.put("appid", request.appId);
                signParams.put("noncestr", request.nonceStr);
                signParams.put("package", request.packageValue);
                signParams.put("partnerid", request.partnerId);
                signParams.put("prepayid", request.prepayId);
                signParams.put("timestamp", request.timeStamp);
                request.sign = genPackageSign(signParams,key);
                iwxapi.sendReq(request);//發(fā)送調(diào)起微信的請求
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    private boolean isInstallWx(Context context){
        if (iwxapi.isWXAppInstalled() && iwxapi.isWXAppSupportAPI()) {
            return true;
        }
        Toast.makeText(context.getApplicationContext(),"您未安裝最新版本微信拨与," +
                "不支持微信支付,請安裝或升級微信版本",Toast.LENGTH_SHORT).show();
        return false;
    }

    /**
     * 調(diào)起微信APP支付秃踩,簽名
     * 生成簽名
     */
    private   String genPackageSign(LinkedHashMap<String, String> params,String key) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String,String> entry: params.entrySet()) {
            sb.append(entry.getKey());
            sb.append('=');
            sb.append(entry.getValue());
            sb.append('&');
        }
        sb.append("key=");
        sb.append(key);

        String packageSign = getMessageDigest(sb.toString().getBytes()).toUpperCase();
        return packageSign;
    }

    /**
     * md5加密
     * @param buffer
     * @return
     */
    private String getMessageDigest(byte[] buffer) {
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(buffer);
            byte[] md = mdTemp.digest();
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }
    /**
     * 獲取隨機(jī)數(shù)
     *
     * @return
     */
    private String genNonceStr() {
        Random random = new Random();
        return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
    }


    /**
     * 獲取時間戳
     *
     * @return
     */
    private long genTimeStamp() {
        return System.currentTimeMillis() / 1000;
    }

    public static class WXPayBuilder {
        public String appId;
        public String partnerId;
        public String prepayId;
        public String packageValue;
        public String nonceStr;
        public String timeStamp;
        public String sign;

        public WXPayUtils build() {
            return new WXPayUtils(this);
        }

        public String getAppId() {
            return appId;
        }

        public WXPayBuilder setAppId(String appId) {
            this.appId = appId;
            return this;
        }

        public String getPartnerId() {
            return partnerId;
        }

        public WXPayBuilder setPartnerId(String partnerId) {
            this.partnerId = partnerId;
            return this;
        }

        public String getPrepayId() {
            return prepayId;
        }

        public WXPayBuilder setPrepayId(String prepayId) {
            this.prepayId = prepayId;
            return this;
        }

        public String getPackageValue() {
            return packageValue;
        }

        public WXPayBuilder setPackageValue(String packageValue) {
            this.packageValue = packageValue;
            return this;
        }

        public String getNonceStr() {
            return nonceStr;
        }

        public WXPayBuilder setNonceStr(String nonceStr) {
            this.nonceStr = nonceStr;
            return this;
        }

        public String getTimeStamp() {
            return timeStamp;
        }

        public WXPayBuilder setTimeStamp(String timeStamp) {
            this.timeStamp = timeStamp;
            return this;
        }

        public String getSign() {
            return sign;
        }

        public WXPayBuilder setSign(String sign) {
            this.sign = sign;
            return this;
        }
    }
}
  • 支付結(jié)果
/**
 * Created by Administrator on 2018/1/25.
 * {"ReturnCode":100,
 * "appid":"wxdf2cabf1061e6fc2",
 * "partnerid":"1497030692",
 * "PrepayId":"wx20180125143653d8e8a085240910652449",
 * "package":"Sign=WXPay",
 * "noncestr":"QC9NQTB4NB8GTC6L6NKA",
 * "timestamp":"1516862216",
 * "sign":"219619027BE60F8B1E7CCC16979C233F"}
 */

public class WxPayResp {
    public int ReturnCode;
    public String appid;
    public String partnerid;
    public String PrepayId;
    public String noncestr;
    public String timestamp;
    public String sign;
    public String packageValue;
    public String payType;
    public String orderId;
    public String tradeNo;

    public WxPayResp(JSONObject wxPayJson){
        try {
            ReturnCode = wxPayJson.getInt("ReturnCode");
            appid = wxPayJson.getString("appid");
            partnerid = wxPayJson.getString("partnerid");
            PrepayId = wxPayJson.getString("PrepayId");
            noncestr = wxPayJson.getString("noncestr");
            timestamp = wxPayJson.getString("timestamp");
            sign = wxPayJson.getString("sign");
            packageValue = wxPayJson.getString("package");
            payType = wxPayJson.getString("payType");
            orderId = wxPayJson.getString("orderId");
            tradeNo = wxPayJson.getString("tradeNo");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衬鱼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子憔杨,更是在濱河造成了極大的恐慌鸟赫,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件消别,死亡現(xiàn)場離奇詭異抛蚤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寻狂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門岁经,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛇券,你說我怎么就攤上這事缀壤。” “怎么了纠亚?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵塘慕,是天一觀的道長。 經(jīng)常有香客問我蒂胞,道長苍糠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任啤誊,我火速辦了婚禮岳瞭,結(jié)果婚禮上拥娄,老公的妹妹穿的比我還像新娘。我一直安慰自己瞳筏,他們只是感情好稚瘾,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姚炕,像睡著了一般摊欠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柱宦,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天些椒,我揣著相機(jī)與錄音,去河邊找鬼掸刊。 笑死免糕,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的忧侧。 我是一名探鬼主播石窑,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚓炬!你這毒婦竟也來了松逊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤肯夏,失蹤者是張志新(化名)和其女友劉穎经宏,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驯击,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烛恤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了余耽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缚柏。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖碟贾,靈堂內(nèi)的尸體忽然破棺而出币喧,到底是詐尸還是另有隱情,我是刑警寧澤袱耽,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布杀餐,位于F島的核電站,受9級特大地震影響朱巨,放射性物質(zhì)發(fā)生泄漏史翘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望琼讽。 院中可真熱鬧必峰,春花似錦、人聲如沸钻蹬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽问欠。三九已至肝匆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間顺献,已是汗流浹背旗国。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留注整,地道東北人能曾。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像设捐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子塘淑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容

  • 具體的接入方法不說了萝招,看支付寶開發(fā)文檔吧,我這里要說的是接入成功后如何去調(diào)用支付方法以及需要注意的一些事項存捺。 首先...
    淺淺_e90e閱讀 2,653評論 1 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評論 25 707
  • 開發(fā)前的準(zhǔn)備工作 SDK說明 接口說明 1槐沼、支付接口 - (BOOL)startPay:(NSString*)tn...
    Detailscool閱讀 3,410評論 5 50
  • 今天周日,初冬的陽光總是那樣好的不得了捌治,空氣里雖然帶著一絲凜冽岗钩,當(dāng)陽光暖的仿佛要把人全身都化了。我在自習(xí)室里已經(jīng)待...
    肆玖兮閱讀 372評論 0 0
  • 元旦以來的這些日子肖油,呆在家里有一些無所事事兼吓,如若不是越來越近的春節(jié)的話,還真找不出幾分喜氣森枪,對這樣太淡然的生活视搏,反...
    戎苑居士閱讀 970評論 0 0