Android-支付宝支付

前言:
紧接着上一篇的微信支付,本篇是集成支付宝支付,相对于微信支付,支付宝的集成就简单了很多。话不多说,我们来看看怎么简单集成支付宝支付。
1.看文档:
我们先要去蚂蚁金服开放平台进行申请,这个需要公司的相关信息,目前个人是不支持的。
这里写图片描述
信息的填写就不介绍了,这个也不是我们所关心的,同时,支付宝更多的是服务器端的集成,甚至不需要我们的包名和签名,app端集成真的就是几句话代码的事情。
2.按照接口文档说明集成:
android支付详情介绍,这个是支付宝介绍的官方页面,虽然简单,但是足够了,所以感慨下支付宝的工程师的确是很强大,简单实用。具体步骤为:
2.1 下载jar包,然后放在lib文件夹下面,最好下载最新的jar包。
2.2 修改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"
            android:exported="false"
            android:screenOrientation="behind" >
</activity>
<activity
            android:name="com.alipay.sdk.auth.AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind" >
 </activity>

3.代码编辑:
3.1 为了方便我们建一个PayUtils,代码如下:

public class PayUtils {

    private Activity mActivity;

    public void setActivity(Activity activity) {
        mActivity = activity;
        setHandle(mActivity);
    }

    private void setHandle(Activity mact) {
        mHandler = new Handler(mact.getMainLooper()) {
            public void handleMessage(Message msg) {
                Log.i("wy", "11111111111" + msg.what);
                switch (msg.what) {
                    case SDK_PAY_FLAG: {
                        PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                        /**
                         对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                         */
                        String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                        String resultStatus = payResult.getResultStatus();
                        // 判断resultStatus 为9000则代表支付成功
                        if (TextUtils.equals(resultStatus, "9000")) {
                            // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                            Log.i("wy", "1");
                        } else {
                            // 该笔订单真实的支付结果,需要依赖服务端的异步通知。
                            Log.i("wy", "2");
                        }
                        break;
                    }
                    case SDK_AUTH_FLAG: {
                        AuthResult authResult = new AuthResult((Map<String, String>) msg.obj, true);
                        String resultStatus = authResult.getResultStatus();
                        // 判断resultStatus 为“9000”且result_code
                        // 为“200”则代表授权成功,具体状态码代表含义可参考授权接口文档
                        if (TextUtils.equals(resultStatus, "9000") && TextUtils.equals(authResult.getResultCode(), "200")) {
                            // 获取alipay_open_id,调支付时作为参数extern_token 的value
                            // 传入,则支付账户为该授权账户
                            Log.i("wy", "3");
                        } else {
                            // 其他状态值则为授权失败
                            Log.i("wy", "4");
                        }
                        break;
                    }
                    default:
                        break;
                }
            }
        };
    }

    private static final int SDK_PAY_FLAG = 11;
    private static final int SDK_CHECK_FLAG = 12;
    private static final int MSG_GET_ACTIVATION = 2;
    private static final int SDK_AUTH_FLAG = 2;

    private Handler mHandler;

    //调用该方法进行支付宝sdk调用
    public void pay(final String payInfo) {
        Runnable authRunnable = new Runnable() {
            @Override
            public void run() {
                // 构造AuthTask 对象
                AuthTask authTask = new AuthTask(mActivity);
                // 调用授权接口,获取授权结果
                Map<String, String> result = authTask.authV2(payInfo, true);
                Message msg = new Message();
                msg.what = SDK_AUTH_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        // 必须异步调用
        Thread authThread = new Thread(authRunnable);
        authThread.start();
    }

}

代码很简单,一个handler,一个调用支付宝的pay方法,注意该handler的生成方法,开始我new Handler的时候没有指定looper,因为该类没有默认的Activity对象,所以会报”Can’t create handler inside thread that has not called Looper.prepare()”错误,不清楚handler的同学,可以去看我以前写的一篇博客(Java中的多线程Thread Runnable及android的handler)。

3.2 Main中的代码:

public class MainActivity extends AppCompatActivity {
    private TextView tv_send;
    private PayUtils mPayUtils;

    //这些都是服务器定义的字段
    private String title = "支付订单";
    private String ordertype = "0";
    private String tomemid="";
    private String price="0.01";
    private String price_tbb = "0";
    private String paytype = "2";
    private String zfpass="";
    private String tokenid="";
    private String platform = "0";

    private  String responsestr="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv_send= (TextView) findViewById(R.id.tv_send);
        tv_send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                getData();
            }
        });
    }

    private void getData(){

        Map<String, String> map = new HashMap<>();
        map.put("tradetype", "APP");
        map.put("title", title);
        map.put("ordertype", ordertype);
        map.put("tomemid", tomemid);
        map.put("price", price);
        map.put("price_tbb", price_tbb);
        map.put("paytype", paytype);
        map.put("zfpass", zfpass);

        PayRequestParam param=new PayRequestParam();
        param.setTradetype("APP");//用户名
        param.setTitle(title);
        param.setTomemid(tomemid);
        param.setPrice(price);
        param.setPrice_tbb(price_tbb + "");
        param.setOrdertype(ordertype);//
        param.setPaytype(paytype);//
        param.setZfpass(zfpass);
        param.setSign(SignUtils.getXfbSign(map));

        PayRequestObject requestobject=new PayRequestObject();
        requestobject.setTokenid(tokenid);
        requestobject.setPlatform(platform);
        requestobject.setParam(param);

        //fastjson
        String jsonstr=JSON.toJSONString(requestobject);

        String url ="";
        //okhttp3
        OkHttpClient client=new OkHttpClient();
        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), jsonstr);

        final Request request=new Request.Builder().url(url).post(requestBody).build();
        Log.i("wy","111111111111");
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                responsestr=response.body().string();

                PayResponseObject object= (PayResponseObject) JSON.parseObject(responsestr,PayResponseObject.class);
                if(mPayUtils==null){
                    mPayUtils=new PayUtils();
                    mPayUtils.setActivity(MainActivity.this);
                }

                mPayUtils.pay(object.getData());
            }
        });
    }

}

这里面更多的是和自己服务器定义接口的一些参数,请求获取代调用支付宝时的String 参数payInfo,该参数的组成可以看支付宝的接口文档,我们客服端也可以自己拼接,但是十分不建议这样做。

3.3其他涉及到的类可以在文末点击下载

4总结:
支付宝支付相对微信支付而言简单太多,并且可以在打包的情况下进行测试,方便开发,但是这只是对于我们移动端开发来说方便很多;大量的工作其实是丢锅给了服务器端。但是对于支付宝的文档以及流程我还是建议大家能够细细的研读,这对于我们开发的思路是大有裨益的。ok,两大支付都介绍完了,希望可以帮到大家。

点击下载代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值