美文网首页开源工具技巧编程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是用正式签名打包出来的。

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

    相关文章

      网友评论

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

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