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.支付完毕,返回---利用订单号查询结果。

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

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

  • 相关阅读:
    如何用ASP.NET加密Cookie数据过程分析
    PHP监控linux服务器负载情况分析解决方案
    我发现了博客的一个小问题
    人生总是有太多的失望
    小公司根据实据情况部署实施Linux集群网站
    刚刚收到光棍短信祝福了!
    我对你的期望有点过了
    PHP在接下来的几年内将是主主流的
    不付出一定不会有收获!
    关于创建RootDesigner的文章
  • 原文地址:https://www.cnblogs.com/miaolegemide/p/7444604.html
Copyright © 2011-2022 走看看