移動(dòng)支付那點(diǎn)事兒

image

關(guān)于本文支付相關(guān)的源碼詳見(jiàn)我的開(kāi)源項(xiàng)目MobilePayment

前言

移動(dòng)支付其實(shí)是非常簡(jiǎn)單的,因?yàn)橹灰凑盏谌降奈臋n來(lái)就行了,所以在本次分享中,其實(shí)更像是一次開(kāi)發(fā)的紀(jì)要,當(dāng)然也有一些看點(diǎn)。做過(guò)支付的人都知道支付的難點(diǎn)其實(shí)是在第三方文檔和demo上(集中體現(xiàn)文檔陳舊、demo容易誤導(dǎo)人、槽點(diǎn)太多),那就不得不先來(lái)吐槽下微信的開(kāi)發(fā)文檔和示例,我相信大部分人都被坑過(guò),沒(méi)有對(duì)比就沒(méi)有傷害,相對(duì)而言,支付寶的的文檔就好很多,下面我先說(shuō)重點(diǎn)再談支付流程。

開(kāi)發(fā)優(yōu)化要點(diǎn)

  • 微信回調(diào)返回當(dāng)前頁(yè)面部分機(jī)型會(huì)產(chǎn)生一閃而過(guò)的黑屏現(xiàn)象,測(cè)試機(jī)型三星S8,解決方案為在微信回調(diào)頁(yè)面增加透明主題,如下:
    <!--解決微信支付回調(diào)部分機(jī)型黑屏閃爍的問(wèn)題-->
    <style name="wxPayTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
    </style>
    
    <!--回調(diào)頁(yè)面WXPayEntryActivity關(guān)閉finish的時(shí)候增加-->
     overridePendingTransition(0, 0);
    
    <!--回調(diào)頁(yè)面WXPayEntryActivity配置-->
     <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:configChanges="orientation|screenSize"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/wxPayTheme"
            android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />
    
     <!--另外一種解決方案-->
     android:launchMode="singleTop"改為android:launchMode="singleInstance"
     建議優(yōu)先采取第一種方案,該方案作為備選,畢竟微信推薦使用"singleTop"啟動(dòng)模式。
  • DialogFragment內(nèi)存泄漏問(wèn)題,google雖然推薦使用DialogFragment替代Dialog,但是內(nèi)存泄漏問(wèn)題并未解決,試過(guò)很多方案,并未完美解決泄漏問(wèn)題,故更改使用Activity結(jié)合動(dòng)畫(huà)實(shí)現(xiàn)底部支付彈窗的效果。
 <!--底部彈框支付Activity主題樣式-->
    <style name="PayTranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowAnimationStyle">@null</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item> <!-- 無(wú)標(biāo)題 -->
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:backgroundDimEnabled">true</item><!-- 半透明 -->
    </style>
    
<!-- R.anim.push_bottom_in 進(jìn)入動(dòng)畫(huà)-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromYDelta="100%p"
        android:toYDelta="0" />
</set>

<!-- R.anim.push_bottom_out 淡出動(dòng)畫(huà)-->
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="300"
        android:fromYDelta="0"
        android:toYDelta="100%p" />
</set>

<!-- R.anim.push_bottom_silent 原點(diǎn)-->
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromYDelta="0"
    android:toYDelta="0" />
    
<!-- 底部彈框-->
startActivity(intent);
overridePendingTransition(R.anim.push_bottom_in,R.anim.push_bottom_silent);

<!-- 關(guān)閉底部彈框-->
finish();
overridePendingTransition(R.anim.push_bottom_silent,R.anim.push_bottom_out);

<!-- 實(shí)現(xiàn)透明狀態(tài)欄-->
setContentView(R.layout.activity_dialog_pay_custom);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    getWindow().setStatusBarColor(Color.TRANSPARENT);
    }

效果圖

image

微信支付

流程

image

沒(méi)錯(cuò),這就是官方的業(yè)務(wù)流程圖,黑糊糊,感覺(jué)就是一張盜版圖,下面我以客戶(hù)端開(kāi)發(fā)為主,簡(jiǎn)化一下流程:

  • 客戶(hù)端App選擇購(gòu)買(mǎi)的商品后,選擇微信支付,接口請(qǐng)求服務(wù)器,服務(wù)器此時(shí)需要生成預(yù)支付訂單(調(diào)用微信統(tǒng)一下單接口),其中返回的參數(shù)便是我們調(diào)起微信支付所需要的參數(shù)。(統(tǒng)一下單
  • 客戶(hù)端拿到服務(wù)器返回的預(yù)支付訂單參數(shù),通過(guò)微信SDK調(diào)起微信支付頁(yè)面
  • 客戶(hù)端收到微信支付的狀態(tài)回調(diào)
  • 通過(guò)服務(wù)器查詢(xún)支付訂單的狀態(tài),注意:以服務(wù)器查詢(xún)的結(jié)果為準(zhǔn),不要使用微信返回給客戶(hù)端的支付狀態(tài)作為支付依據(jù)。(訂單查詢(xún)

集成

  • 微信開(kāi)放平臺(tái)注冊(cè)及配置

image

1.申請(qǐng)應(yīng)用獲取微信平臺(tái)生成的唯一APPID(管理中心-創(chuàng)建應(yīng)用
2.配置簽名,獲取應(yīng)用的簽名(簽名工具
3.配置應(yīng)用包名,此處文檔太老舊,應(yīng)該為buile.gradle中的applicationId

  • 注冊(cè)APPID
 IWXAPI api = WXAPIFactory.createWXAPI(this, APP_ID);
  • 調(diào)用SDK發(fā)起支付
  /**
     * 微信支付
     *
     * @param payInfo 預(yù)支付信息
     */
    private void wechatPay(final String payInfo) {
        try {
            JSONObject json = new JSONObject(payInfo);
            if (!json.has("retcode")) {
                PayReq req = new PayReq();
                // 測(cè)試用appId
                req.appId = APP_ID;
//                req.appId = json.getString("appid");
                req.partnerId = json.getString("partnerid");
                req.prepayId = json.getString("prepayid");
                req.nonceStr = json.getString("noncestr");
                req.timeStamp = json.getString("timestamp");
                req.packageValue = json.getString("package");
                req.sign = json.getString("sign");
                req.extData = "app data";
                Toast.makeText(PayDialogActivity.this, "正常調(diào)起支付", Toast.LENGTH_SHORT).show();
                // 在支付之前,如果應(yīng)用沒(méi)有注冊(cè)到微信,應(yīng)該先調(diào)用IWXMsg.registerApp將應(yīng)用注冊(cè)到微信
                api.sendReq(req);
            }
        } catch (JSONException e) {
            e.printStackTrace();
            showToast(this, "異常:" + e.getMessage());
        }
    }
  • 微信回調(diào)界面
    1.目錄結(jié)構(gòu)配置,需要在包名下新建wxapi目錄,并增加回調(diào)界面WXPayEntryActivity,如下圖:
    image

    2.回調(diào)界面示例
/**
 * @author hule
 * @date 2019/7/29 15:58
 * description: 微信支付回調(diào)
 */
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //此處如果需要顯示界面需要設(shè)置setContentView();
        //一般情況下會(huì)都不會(huì)去設(shè)置界面,拿到回調(diào)后直接關(guān)閉界面,發(fā)送通知處理
        api = WXAPIFactory.createWXAPI(this, PayDialogActivity.APP_ID);
        api.handleIntent(getIntent(), this);
    }

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

    @Override
    public void onReq(BaseReq req) {

    }

    @Override
    public void onResp(BaseResp resp) {
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            //通知我們回調(diào),我們拿來(lái)查詢(xún)訂單的狀態(tài)
            EventBus.getDefault().post(new WXPayEntryEntity(resp.errCode));
        }
        // 清除動(dòng)畫(huà),有助于防止黑屏閃爍
        overridePendingTransition(0, 0);
        finish();
    }
}

3.回調(diào)頁(yè)面配置

    <!--解決微信支付回調(diào)部分機(jī)型黑屏閃爍的問(wèn)題-->
    <style name="wxPayTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowNoTitle">true</item>
    </style>
    
    <!--回調(diào)頁(yè)面WXPayEntryActivity關(guān)閉finish的時(shí)候增加-->
     overridePendingTransition(0, 0);

 <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:configChanges="orientation|screenSize"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/wxPayTheme"
            android:windowSoftInputMode="adjustPan|stateAlwaysHidden" />
  • 查詢(xún)訂單支付結(jié)果,并提示給用戶(hù)
    @Subscribe(threadMode = ThreadMode.MAIN)
    public void payment(WXPayEntryEntity wxPayEntryEntity) {
        //TODO 當(dāng)客戶(hù)端收到微信支付成功的回調(diào)后,繼續(xù)向后臺(tái)服務(wù)器進(jìn)行驗(yàn)證為最終的結(jié)果
        // .......此處省略調(diào)用服務(wù)器接口,查詢(xún)結(jié)果邏輯......
        // 此處以下代碼只是作為測(cè)試使用,這里需要去服務(wù)器異步查詢(xún)結(jié)果
        switch (wxPayEntryEntity.getPayStatus()) {
            case BaseResp.ErrCode.ERR_OK:
                showToast(this, "支付成功");
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                showToast(this, "微信授權(quán)失敗");
                break;
            case BaseResp.ErrCode.ERR_COMM:
                showToast(this, "訂單支付失敗!");
                break;
            case BaseResp.ErrCode.ERR_SENT_FAILED:
                showToast(this, "微信發(fā)送失敗");
                break;
            case BaseResp.ErrCode.ERR_UNSUPPORT:
                showToast(this, "微信不支持");
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                showToast(this, "用戶(hù)點(diǎn)擊取消并返回");
                break;
            default:
                showToast(this, "訂單支付失敗!");
                break;
        }
    }

  • 混淆配置
# 微信混淆
-keep class com.tencent.mm.opensdk.** { *; }

-keep class com.tencent.wxop.** { *; }

-keep class com.tencent.mm.sdk.** { *; }

支付寶支付

流程

[圖片上傳失敗...(image-92d9c1-1567066470689)]
其實(shí)流程和微信差不多,對(duì)于A(yíng)PP端只需要簡(jiǎn)單的幾個(gè)流程就能完成支付寶支付

  • 下單后,選擇支付寶支付,客戶(hù)端向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器產(chǎn)生預(yù)支付訂單,并返回給客戶(hù)端
  • 客戶(hù)端拿到預(yù)支付訂單的相關(guān)參數(shù),通過(guò)支付寶SDK喚起支付
  • 客戶(hù)端拿到支付寶返回的支付結(jié)果,向商戶(hù)后臺(tái)服務(wù)器查詢(xún)最終的訂單完成信息。

集成

  • 接入支付寶SDK
    1.下載SDK
    2.將alipaySdk-15.6.5-20190718211148.aar復(fù)制到libs目錄下
    3.工程目錄的build.gradle添加
allprojects {
    repositories {
        // 支付寶 SDK AAR 包所需的配置
        flatDir {
            dirs 'libs'
        }
        google()
        jcenter()
    }
}

4.Module項(xiàng)目的build.gradle增加依賴(lài)

// 支付寶 SDK AAR 包所需的配置
implementation (name: 'alipaySdk-15.6.5-20190718211148', ext: 'aar')
  • 添加權(quán)限
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  • 調(diào)用支付
    /**
     * 支付寶支付
     *
     * @param payInfo 預(yù)支付信息
     */
    private void aliPay(final String payInfo) {
        // 1.去服務(wù)器拿支付訂單
        final Runnable payRunnable = new Runnable() {
            @Override
            public void run() {
                PayTask aliPay = new PayTask(PayDialogActivity.this);
                Map<String, String> result = aliPay.payV2(payInfo, true);
                Log.d(TAG, result.toString());
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                payHandler.sendMessage(msg);
            }
        };
        // 必須異步調(diào)用
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }
  • 支付寶回調(diào)
  /**
     * 支付寶回調(diào)
     */
    static class PayHandler extends Handler {
        private final WeakReference<PayDialogActivity> payDialogActivityWrf;
        private PayHandler(PayDialogActivity payDialogActivityWrf) {
            this.payDialogActivityWrf = new WeakReference<>(payDialogActivityWrf);
        }
        @Override
        public void handleMessage(Message msg) {
            if (SDK_PAY_FLAG == msg.what) {
                @SuppressWarnings("unchecked")
                PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                //對(duì)于支付結(jié)果,請(qǐng)商戶(hù)依賴(lài)服務(wù)端的異步通知結(jié)果。同步通知結(jié)果,僅作為支付結(jié)束的通知。
                String resultStatus = payResult.getResultStatus();
                // 判斷resultStatus 為9000則代表支付成功
                if (TextUtils.equals(resultStatus, CODE_9000)) {
                    // TODO 該筆訂單是否真實(shí)支付成功,需要依賴(lài)[服務(wù)端的異步通知]。
                    // 該筆訂單是否真實(shí)支付成功,需要依賴(lài)服務(wù)端的異步通知。
                    if (payDialogActivityWrf.get() != null) {
                        payDialogActivityWrf.get().showAlert(payDialogActivityWrf.get(), "支付成功!");
                    }
                } else {
                    // TODO 該筆訂單是否真實(shí)支付成功,需要依賴(lài)[服務(wù)端的異步通知]。
                    if (payDialogActivityWrf.get() != null) {
                        payDialogActivityWrf.get().showAlert(payDialogActivityWrf.get(), "支付失敗!");
                    }
                }
            }
        }
    }
  • 關(guān)于混淆
    由于新版的支付寶SDK采用的是aar替換了原來(lái)舊版的jar包,默認(rèn)aar中已經(jīng)幫你做出了混淆,故新版的支付寶無(wú)需手動(dòng)混淆
    ,以下是aar中解壓出來(lái)的混淆說(shuō)明
# 這個(gè) ProGuard 文件被指定為 consumerProguardFiles。
# 如此一來(lái),AAR 包的使用者在其應(yīng)用進(jìn)行 ProGuard 混淆時(shí),將自動(dòng)附加下列規(guī)則,
# 省去了接入 JAR 時(shí)手動(dòng)在 ProGuard 規(guī)則文件中加入支付寶 SDK 規(guī)則的步驟。

-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
    <fields>;
    <methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}

# SDK 包可能不包含 utdid
-dontwarn com.ta.utdid2.**
-dontwarn com.ut.device.**

# SDK 包可能不包含 securitysdk
-dontwarn com.alipay.mobilesecuritysdk.**

總結(jié)

關(guān)于支付大概就是這么多了,總而言之,對(duì)于移動(dòng)支付,APP客戶(hù)端流程只需要做到以下幾點(diǎn)就能完成支付:

  • 商戶(hù)服務(wù)器產(chǎn)生預(yù)支付訂單
  • 客戶(hù)端通過(guò)預(yù)訂單參數(shù)調(diào)用支付SDK客戶(hù)端
  • 拿到支付客戶(hù)端返回的訂單信息并以商戶(hù)后臺(tái)服務(wù)器查詢(xún)的訂單為最終結(jié)果
image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評(píng)論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,442評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,835評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,581評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,922評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,096評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,374評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,591評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,789評(píng)論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,196評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,524評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,322評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,554評(píng)論 2 379

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

  • 支付 1.支付寶和銀聯(lián)的支付流程 常用的支付方式有: 1、支付寶支付 https://openhome.alipa...
    丶逐漸閱讀 1,686評(píng)論 3 11
  • 支付寶簡(jiǎn)介文檔 (適用于ydm-java接口與后臺(tái),如有誤入,但愿也能給您帶來(lái)幫助) 此文檔寫(xiě)于2017年3月,只...
    隔壁付叔叔閱讀 17,108評(píng)論 3 19
  • 實(shí)現(xiàn)支付寶支付的準(zhǔn)備工作: 1.向支付寶簽約,成為支付寶的商戶(hù) 簽約完成后,支付寶會(huì)提供一些必要的數(shù)據(jù)給我們 商戶(hù)...
    Anson楊春安閱讀 8,243評(píng)論 0 6
  • 準(zhǔn)備工作: 需要公司的營(yíng)業(yè)執(zhí)照,稅務(wù)信息,等老板的身份證信息等,我記得,用這些材料,去支付寶注冊(cè)一個(gè)商家賬戶(hù)(審核...
    Hevin_Chen閱讀 6,820評(píng)論 0 9
  • 微信支付邏輯? 1、顧客選擇商品 2、顧客選到心怡的商品找店員結(jié)算 3、店員拿著顧客交給他的商品生成預(yù)付單(后臺(tái)服...
    Carden閱讀 590評(píng)論 0 0