zoukankan      html  css  js  c++  java
  • 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.支付完毕,返回---利用订单号查询结果。

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

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

  • 相关阅读:
    hdu acm 2844 Coins 解题报告
    hdu 1963 Investment 解题报告
    codeforces 454B. Little Pony and Sort by Shift 解题报告
    广大暑假训练1 E题 Paid Roads(poj 3411) 解题报告
    hdu acm 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    hdu acm 1114 Piggy-Bank 解题报告
    poj 2531 Network Saboteur 解题报告
    数据库范式
    ngnix 配置CI框架 与 CI的简单使用
    Vundle的安装
  • 原文地址:https://www.cnblogs.com/miaolegemide/p/7444604.html
Copyright © 2011-2022 走看看