android:讲述一下我的第三方支付之路(微信和支付宝)

先讲述繁琐版本:因为一开始我并不是很了解支付这一块也是第一次去做,所以开始聊聊我的踩坑道路

支付宝还是很好理解的

首先是导入包/库,复制一些代码:

比如说以上这些,其次是manifest页面

必须要写的一些权限

<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" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

还有就是支付宝要求的activity

  <!--支付宝-->
        <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation|screenSize"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
        </activity>
        <activity
            android:name="com.alipay.sdk.app.H5AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
        </activity>

以上两个activity最好不要有任何的改动,因为这关乎到你手机没有支付宝的情况下,他能通过走H5页面来支付。

还有就是打包混淆这个不用多说,只是练习的话不需要

-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.** { *;}

 

我关于支付踩的第一个坑就是上边两个activity,剩下的支付宝就不会出现问题了,不说了直接上代码。

调起支付:

这个ordderinfo=app支付请求参数字符串,主要包含商户的订单信息,key=value形式,以&连接。也就是sign,一般是由后台生成,想自己生成,可以去下载支付宝源码看一下他的方式,传送门:https://docs.open.alipay.com/54/104509

final String orderInfo = info;   // 订单信息

        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                PayTask alipay = new PayTask(DemoActivity.this);
                String result = alipay.payV2(orderInfo,true);

                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
         // 必须异步调用
        Thread payThread = new Thread(payRunnable);
        payThread.start();

返回结果:

private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            Result result = new Result((String) msg.obj);
            Toast.makeText(DemoActivity.this, result.getResult(),
                        Toast.LENGTH_LONG).show();
        };
    };

以上就是支付宝的过程 很简单吧只有一个坑而已,就是manifest界面的两个activity一个都不能少,也不能动;

 

 

微信的打地鼠过程

微信最大的一个坑就是应用签名这一块

 

这个是要通过传送门:下载应用签名工具

然后安装到手机上输入包名,再在这个网页设置一下应用签名就成了,应用签名和包名一定要对应一致,不然你的支付只能发起一次,就再也发起不了了。

 和支付宝的顺序一样先导包/库和代码,权限和支付宝差不太多,第二个坑来了。

wxapi这个包必须放置在你的包名下,不能放置到别的包里也不能从新建立,名字都不能改;

原因貌似是微信是有一个异步回调的,好像是你如果放到别的地方,就返回不了结果了。

就是上图的那个onReq和onResp方法 嘿嘿...也可以在这里写你的结果

下一步注册Appid在网页上注册好了,拿回来放到你要支付的页面里

  //微信注册在APP内

                  api = WXAPIFactory.createWXAPI(PayActivity.this,null);

                 api.registerApp(APP_ID); 

之后就是调起支付了

微信端需要的参数很多,不同于支付宝只有一条参数。

                    req=new PayReq();
                    req.appId=wx.getAppid();
                    req.sign=wx.getSign();
                    req.nonceStr=wx.getNonce_str();
                    req.packageValue=wx.getPackageX();
                    req.timeStamp=wx.getTime_stamp();
                    req.prepayId=wx.getPrepay_id();
                    req.partnerId=wx.getMch_id();
                    api.sendReq(req);

然后就要用到我说的获取结果参数了

@Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp resp) {
        L.d("TAG","errCode-------"+resp.errCode);
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            Intent intent=new Intent(WXPayEntryActivity.this,PayResultActivity.class);
            intent.putExtra("WXResult",""+resp.errCode);
            startActivity(intent);
            finish();
        }
    }

这样微信也就完成了

 

其实现在回想起来坑就少了,刚开始写的时候这个不懂那个不懂就很麻烦;

 

 

现在开始说简易版也就是咱们真正要用到的

 

因为是简易版就是先走一下逻辑

1.生成订单编号----把后台需要的参数发给他拿到订单编号--------------------------2.选择微信/支付宝,然后用订单编号拿到微信/支付宝所需参数-----------------------3.用2的参数发起支付-------------4.支付完毕,返回---利用订单号查询结果。

总体逻辑就是一切需要参数和算法的东西你都不需要过手,你就只需要会发起支付就成了。

 

 

 

 

以上就是微信和支付宝支付的核心,这也是我自己的笔记。嘿嘿

posted @ 2017-08-28 16:54  李小姐的猫咪生活  阅读(460)  评论(0编辑  收藏  举报