美文网首页开源工具技巧编程Android知识
三方接入系列之——微信、支付宝支付接入

三方接入系列之——微信、支付宝支付接入

作者: 奔跑吧李博 | 来源:发表于2017-10-29 21:13 被阅读257次

"老板,来个煎饼。" "好勒,这里扫微信。"
现如今的app,你没个微信支付宝支付,怎么好意思说自己公司能盈利。大街小巷都是扫码支付,支付已经深深嵌入在我们生活中。今天我们就来接入支付宝和微信吧。

github代码传送门: https://github.com/18380438200/WXALIPAY
先上效果图:

项目效果 demo结构

支付宝篇:

熟悉流程预个热:

支付流程图

1.当我们看到欣喜的商品,选择颜色,大小,配置级别,数量,选出这款sku,先向后台发起订单。
2.后台返回商品价格,数量,详情等,库存减少。
3.app拿到这些支付信息,向支付宝调起支付。
4.密码输入完成,支付结束后,客户端再次向服务端请求确认支付,而不应该仅靠返回码判断。

配置:
首先去[支付宝开放平台] https://docs.open.alipay.com/204/105297/
1.创建应用并获取APPID,填写应用信息

2.用正是的keystore.jks签名工具,打包出app,然后用微信或者新浪微博出的获取签名工具 [此处获得]https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
,输入你应用的包名获取一串签名。因为微信支付宝认证平台都需要填写这个签名。

从已安装app获取签名

3.导入alipaySdk.jar

4.加入h5页

        <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
            android:name="com.alipay.sdk.app.H5AuthActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" />

5.传入商品id,数量,请求后台获取支付参数,我把我项目的支付参数弄过来:

{"data":"alipay_sdk=lokielse%2Fomnipayalipay
&app_id=2017053107389459
&biz_content=%7B%22subject%22%3A%22%5Cu91d1%5Cu5e01%5Cu5145%5Cu503c%22%2C%22out_trade_no%22%3A%22201710291326384447%22%2C%22total_amount%22%3A0.01%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%7D
&charset=UTF8
&format=JSON
&method=alipay.trade.app.pay
&notify_url=http%3A%2F%2Fwww.goobird.com%2Falipay%2Freturn
&sign_type=RSA2&timestamp=2017-10-29+13%3A26%3A38
&version=1.0
&sign=kHmyzkbQF3arKQB2OdTURyAC0grwyI5ZcqfhSNWjK0kzVoLAGsd%2B%2Bi0MbWgREAJc7iTYr93sKELpb9%2FnGcKuUFyFgmqoQgSA%2FM8QDcCW9RpuXjpIFxWSqNUXNxNRKmWv7hi%2BwODCXSDovn6Hg65%2Fu7DU1Y%2BofsPbn2PHHndih6c04lLrNPdfh5pUNlLWWvuwZmXl27HPHGk8KI6gl2dvyTMEKxApAlKROUgaVZwoCx0trCg9Elne%2BXQm0RCbagA7QWLspIU55O1Tj%2FkW8rwpdbD4s3dRFqEhDbbZHkEYRGIrVQ%2BfYqwToiW8GbqHlf%2FlazZrbS%2FgVknEnXjOMp%2BSow%3D%3D"}

这个需要解析清楚,因为android或者后台都有可能把这些参数弄错或者遗漏。因为曾经有一家公司接微信支付最后没有加signtype,让我找了大半天才找到原因。

6.PayTask调起支付

    private void requestForAli(final String payInfo){
        Runnable payRunnable = new Runnable() {

            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask((Activity) context);
                // 调用支付接口,获取支付结果
                Map<String, String> result = alipay.payV2(payInfo, true);
                Message msg = new Message();
                msg.what = SDK_PAY_FLAG;
                msg.obj = result;
                mHandler.sendMessage(msg);
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

7.处理支付完成的回调

    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @SuppressWarnings("unused")
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case SDK_PAY_FLAG: {
                    @SuppressWarnings("unchecked")
                    PayResult payResult = new PayResult((Map<String, String>) msg.obj);
                    //对于支付结果,请商户依赖服务端的异步通知结果。同步通知结果,仅作为支付结束的通知。
                    String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                    String resultStatus = payResult.getResultStatus();
                    // 判断resultStatus 为9000则代表支付成功
                    if (TextUtils.equals(resultStatus, "9000")) {
                        // 该笔订单是否真实支付成功,需要依赖服务端的异步通知。
                        Toast.makeText(context, "支付成功", Toast.LENGTH_SHORT).show();
                    } else if (TextUtils.equals(resultStatus, "6002")) {
                        Toast.makeText(context,"网络有问题",Toast.LENGTH_SHORT).show();
                    } else if (TextUtils.equals(resultStatus, "6001")) {
                        Toast.makeText(context,"您已经取消支付",Toast.LENGTH_SHORT).show();
                    } else {
                        Toast.makeText(context,"支付失败",Toast.LENGTH_SHORT).show();
                    }
                    break;
                }
                default:
                    break;
            }
        }
    };

微信篇:

支付流程:同支付宝

配置:
去[微信开放平台]https://open.weixin.qq.com/cgi-bin/frame?t=home/app_tmpl&lang=zh_CN(https://docs.open.alipay.com/204/105297/)
1.创建应用并获取APPID和Appcecrete,填写应用信息
2.同样需要正式签名配置到开放平台
3.导入微信支付开发工具包 libammsdk.jar
4.加入微信支付权限
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
5.请求后台获取微信支付参数
6.发起微信支付请求

    private void sendWxPayRes(JSONObject prepayObj) {
        if (!iwxapi.isWXAppInstalled()) {
            Toast.makeText(getApplicationContext(),"您还未安装微信客户端",Toast.LENGTH_SHORT).show();
            return;
        }

        PayReq req = new PayReq();
        try {
            req.appId = prepayObj.getString("appid");
            req.partnerId = prepayObj.getString("partnerid");   //微信收款号
            req.prepayId = prepayObj.getString("prepayid");   //预支付id
            req.nonceStr = prepayObj.getString("noncestr");  //订单号,由后端生成
            req.timeStamp = prepayObj.getString("timestamp");  //时间戳
            req.packageValue = prepayObj.getString("package");  
            req.sign = prepayObj.getString("sign");   //将以上参数拼接处理而来
        } catch (JSONException e) {
            e.printStackTrace();
        }
        iwxapi.sendReq(req);
    }

prepayObj为第5步获取的预支付参数

7.获取支付结束回调
在应用程序包路径下一层创建wxapi的包,再创建WXPayEntryActivity类,如下:

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;
    private String appId = "";
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        api = WXAPIFactory.createWXAPI(this, appId);
        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) {

        switch (resp.errCode){
            case -1:
                Toast.makeText(getApplicationContext(),"支付失败", Toast.LENGTH_SHORT).show();
            case 0:
                Toast.makeText(getApplicationContext(),"支付成功", Toast.LENGTH_SHORT).show();
                break;
            case -2:
                Toast.makeText(getApplicationContext(),"支付取消", Toast.LENGTH_SHORT).show();
                break;
        }
    }

}

0表示支付成功,此时再次向后台请求确认支付成功。

测试不通过需要确认的:
1.确认你的经理在开发平台通过了支付权限。
2.确认正式签名填写在了平台配置里。
3.确认apk是用正式签名打包出来的。

也许你正在接入,但是遇到问题千万不要着急,接入支付踩到坑里很正常,大家都是怎么过来的,多检查检查细节突然就调起支付页面了,你一定会高兴地叫起来。

相关文章

  • 第三方支付平台整理

    第三方支付平台详情 接入文档 支付宝微信支付 收费率 限额 大额支付平台

  • 支付业务实战对复杂if else 判断的优化

    背景 最近在做项目的时候,需要接入支付。由于接入第三方支付而且还不知止一家,需要接入很多家。比如说支付宝、微信、富...

  • 超详细Android接入支付宝支付实现,有图有真相

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微...

  • 三方接入系列之——微信、支付宝支付接入

    "老板,来个煎饼。" "好勒,这里扫微信。"现如今的app,你没个微信支付宝支付,怎么好意思说自己公司能盈利。大...

  • 三方支付接入(PHP)

    微信、微信直付通、支付宝、支付宝全球购、支付宝分账、银联、农行 现在三方支付的接入越来越多,作为一名PHP研发一直...

  • 支付宝App支付全解析

    简单介绍了支付宝App支付的申请、接入、使用、确认支付结果等相关流程 0 系列文章 系列一 微信App支付全解析系...

  • 支付

    支付宝集成:http://caoyudong.com/2016/01/03/iOS接入支付宝/ 微信支付:http...

  • 支付宝即时到账支付全解析

    简单介绍了支付宝即时到账支付-即PC端支付的申请、接入、使用、确认支付结果等相关流程 0 系列文章 系列一 微信A...

  • 微信条码支付正式接入银联清算

    银联收编支付宝微信早已有传,近日,微信支付正式宣布将其条码支付业务接入银联,并由银联提供转接清算服务,但是接入的具...

  • 一些学习资料

    iOS各种支付功能 :链接 其中:1支付宝app支付接入指南:链接2微信app支付接入指南:链接 Unity3d游...

网友评论

    本文标题:三方接入系列之——微信、支付宝支付接入

    本文链接:https://www.haomeiwen.com/subject/mtkupxtx.html