微信/支付宝 第三方支付相关

支付宝

  • 无客户端时,可调用网页支付
 <activity
            android:name="com.alipay.sdk.app.H5PayActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="false"
            android:screenOrientation="behind"
            android:windowSoftInputMode="adjustResize|stateHidden" >
 </activity>
  • 支付结果
 public class AliPayResult  {
    private String resultStatus;
    private String result;
    private String memo;

    public AliPayResult(Map<String, String> rawResult) {
        if (rawResult == null) {
            return;
        }

        for (String key : rawResult.keySet()) {
            if (TextUtils.equals(key, "resultStatus")) {
                resultStatus = rawResult.get(key);
            } else if (TextUtils.equals(key, "result")) {
                result = rawResult.get(key);
            } else if (TextUtils.equals(key, "memo")) {
                memo = rawResult.get(key);
            }
        }
    }

    @Override
    public String toString() {
        return "resultStatus={" + resultStatus + "};memo={" + memo
                + "};result={" + result + "}";
    }

    /**
     * @return the resultStatus
     */
    public String getResultStatus() {
        return resultStatus;
    }

    /**
     * @return the memo
     */
    public String getMemo() {
        return memo;
    }

    /**
     * @return the result
     */
    public String getResult() {
        return result;
    }
}
  • 发起支付
public class AliPayUtils {
    private static AliPayUtils aliPayUtils = null;

    private AliPayUtils(){

    }

    public static AliPayUtils getInstance(){
        if (aliPayUtils == null)
            aliPayUtils = new AliPayUtils();
        return aliPayUtils;
    }

    public void alipay_v2(final String orderInfo, final IPayCallback callback){
        new RxJavaUtils<String>().handleDataByThread(new RxScheduler<String>() {
            @Override
            public String doInThread() {
                PayTask alipay = new PayTask(ThirdPayUtils.mActivity);
                Map<String, String> result = alipay.payV2(orderInfo, true);
                Log.i("msp", result.toString());
                AliPayResult payResult = new AliPayResult(result);
                String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                String resultStatus = payResult.getResultStatus();
                return resultStatus;
            }

            @Override
            public void doInUI(String resultCode) {
                if(callback != null)
                    callback.onResult(resultCode);
            }
        });
    }
}

微信

  • 回调接收类 (包名目录下wxapi.WXPayEntryActivity)
public class WXPayEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {
    private static final String TAG = WXPayEntryActivity.class.getSimpleName();
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        api = WXAPIFactory.createWXAPI(this, "wx4f6d2f117e3724ec");
        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {
    }

    @Override
    public void onResp(BaseResp baseResp) {
        if (baseResp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            L.i("onResp:" + baseResp.errCode);
            if (ThirdPayUtils.mCallbackContext != null && ThirdPayUtils.mWxPayResp != null) {
                try {
                    JSONObject respJson = new JSONObject();
                    respJson.put("resultCode", String.valueOf(baseResp.errCode));
                    respJson.put("payType", ThirdPayUtils.mWxPayResp.payType);
                    respJson.put("orderId", ThirdPayUtils.mWxPayResp.orderId);
                    respJson.put("tradeNo", ThirdPayUtils.mWxPayResp.tradeNo);
                    L.i(TAG, "wxPay callback--->" + respJson.toString());
                    ThirdPayUtils.mCallbackContext.success(respJson);
                    ThirdPayUtils.mWxPayResp = null;
                    ThirdPayUtils.mCallbackContext = null;
                    finish();
                } catch (JSONException e) {

                }
            }
        }
    }
}
  • 清单配置
 <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:theme="@style/AppStartLoadTheme"
            android:exported="true"
            android:launchMode="singleTop" />

<activity-alias
            android:name="${applicationId}.wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:targetActivity=".wxapi.WXPayEntryActivity"/>
  • 发起支付
// 从服务器获取加密后的相关支付参数
JSONObject aliPayJson = args.getJSONObject(0);
                L.i(TAG, "aliPayJson:" + aliPayJson);
                final String payType = aliPayJson.getString("payType");
                final String orderId = aliPayJson.getString("orderId");
                final String tradeNo = aliPayJson.getString("tradeNo");
                String orderInfo = aliPayJson.getString("sign");
                AliPayUtils.getInstance().alipay_v2(orderInfo, new IPayCallback() {
                    @Override
                    public void onResult(String resultCode) {
                        try {
                            JSONObject respJson = new JSONObject();
                            respJson.put("resultCode", resultCode);
                            respJson.put("payType", payType);
                            respJson.put("orderId", orderId);
                            respJson.put("tradeNo", tradeNo);
                            L.i(TAG, "aliPay callback--->" + respJson.toString());
                            //回调给页面
                            callbackContext.success(respJson);
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
  • 支付工具类
public class WXPayUtils {
    private IWXAPI iwxapi; //微信支付api

    private WXPayBuilder builder;

    private WXPayUtils(WXPayBuilder builder) {
        this.builder = builder;
    }

    /**
     * 调起微信支付的方法,不需要在客户端签名
     **/
    public void toWXPayNotSign(Context context, String appid) {
        iwxapi = WXAPIFactory.createWXAPI(context, null); //初始化微信api
        iwxapi.registerApp(appid); //注册appid  appid可以在开发平台获取

       if (!isInstallWx(context))
           return;

        Runnable payRunnable = new Runnable() {  //这里注意要放在子线程
            @Override
            public void run() {
                PayReq request = new PayReq(); //调起微信APP的对象
                //下面是设置必要的参数,也就是前面说的参数,这几个参数从何而来请看上面说明
                request.appId = builder.getAppId();
                request.partnerId = builder.getPartnerId();
                request.prepayId = builder.getPrepayId();
                request.packageValue = builder.getPackageValue();
                request.nonceStr = builder.getNonceStr();
                request.timeStamp = builder.getTimeStamp();
                request.sign = builder.getSign();
                L.i("MyPlugin", "wxPay sendReq--->appid:" + request.appId +
                        " nonceStr:" + request.nonceStr + " sign:" + request.sign);
                iwxapi.sendReq(request);//发送调起微信的请求
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    /**
     * 调起微信支付的方法,需要在客户端签名
     **/
    public void toWXPayAndSign(Context context, String appid,final String key) {
        iwxapi = WXAPIFactory.createWXAPI(context, null); //初始化微信api
        iwxapi.registerApp(appid); //注册appid  appid可以在开发平台获取

        if (!isInstallWx(context))
            return;

        Runnable payRunnable = new Runnable() {  //这里注意要放在子线程
            @Override
            public void run() {
                if (TextUtils.isEmpty(builder.getAppId())
                        ||TextUtils.isEmpty(builder.getPartnerId())
                        ||TextUtils.isEmpty(builder.getPrepayId())){
                    Log.e("chx", "toWXPayAndSign: "+"必须在builder中设置appId、PartnerId、PrepayId");
                    return;
                }
                PayReq request = new PayReq(); //调起微信APP的对象
                //下面是设置必要的参数,也就是前面说的参数,这几个参数从何而来请看上面说明
                request.appId = builder.getAppId();
                request.partnerId = builder.getPartnerId();
                request.prepayId = builder.getPrepayId();
                request.packageValue = "Sign=WXPay";
                request.nonceStr = genNonceStr();
                request.timeStamp = String.valueOf(genTimeStamp());
                request.sign = builder.getSign();
                //签名
                LinkedHashMap<String, String> signParams = new LinkedHashMap<>();
                signParams.put("appid", request.appId);
                signParams.put("noncestr", request.nonceStr);
                signParams.put("package", request.packageValue);
                signParams.put("partnerid", request.partnerId);
                signParams.put("prepayid", request.prepayId);
                signParams.put("timestamp", request.timeStamp);
                request.sign = genPackageSign(signParams,key);
                iwxapi.sendReq(request);//发送调起微信的请求
            }
        };
        Thread payThread = new Thread(payRunnable);
        payThread.start();
    }

    private boolean isInstallWx(Context context){
        if (iwxapi.isWXAppInstalled() && iwxapi.isWXAppSupportAPI()) {
            return true;
        }
        Toast.makeText(context.getApplicationContext(),"您未安装最新版本微信," +
                "不支持微信支付,请安装或升级微信版本",Toast.LENGTH_SHORT).show();
        return false;
    }

    /**
     * 调起微信APP支付,签名
     * 生成签名
     */
    private   String genPackageSign(LinkedHashMap<String, String> params,String key) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String,String> entry: params.entrySet()) {
            sb.append(entry.getKey());
            sb.append('=');
            sb.append(entry.getValue());
            sb.append('&');
        }
        sb.append("key=");
        sb.append(key);

        String packageSign = getMessageDigest(sb.toString().getBytes()).toUpperCase();
        return packageSign;
    }

    /**
     * md5加密
     * @param buffer
     * @return
     */
    private String getMessageDigest(byte[] buffer) {
        char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
        try {
            MessageDigest mdTemp = MessageDigest.getInstance("MD5");
            mdTemp.update(buffer);
            byte[] md = mdTemp.digest();
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            return null;
        }
    }
    /**
     * 获取随机数
     *
     * @return
     */
    private String genNonceStr() {
        Random random = new Random();
        return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
    }


    /**
     * 获取时间戳
     *
     * @return
     */
    private long genTimeStamp() {
        return System.currentTimeMillis() / 1000;
    }

    public static class WXPayBuilder {
        public String appId;
        public String partnerId;
        public String prepayId;
        public String packageValue;
        public String nonceStr;
        public String timeStamp;
        public String sign;

        public WXPayUtils build() {
            return new WXPayUtils(this);
        }

        public String getAppId() {
            return appId;
        }

        public WXPayBuilder setAppId(String appId) {
            this.appId = appId;
            return this;
        }

        public String getPartnerId() {
            return partnerId;
        }

        public WXPayBuilder setPartnerId(String partnerId) {
            this.partnerId = partnerId;
            return this;
        }

        public String getPrepayId() {
            return prepayId;
        }

        public WXPayBuilder setPrepayId(String prepayId) {
            this.prepayId = prepayId;
            return this;
        }

        public String getPackageValue() {
            return packageValue;
        }

        public WXPayBuilder setPackageValue(String packageValue) {
            this.packageValue = packageValue;
            return this;
        }

        public String getNonceStr() {
            return nonceStr;
        }

        public WXPayBuilder setNonceStr(String nonceStr) {
            this.nonceStr = nonceStr;
            return this;
        }

        public String getTimeStamp() {
            return timeStamp;
        }

        public WXPayBuilder setTimeStamp(String timeStamp) {
            this.timeStamp = timeStamp;
            return this;
        }

        public String getSign() {
            return sign;
        }

        public WXPayBuilder setSign(String sign) {
            this.sign = sign;
            return this;
        }
    }
}
  • 支付结果
/**
 * Created by Administrator on 2018/1/25.
 * {"ReturnCode":100,
 * "appid":"wxdf2cabf1061e6fc2",
 * "partnerid":"1497030692",
 * "PrepayId":"wx20180125143653d8e8a085240910652449",
 * "package":"Sign=WXPay",
 * "noncestr":"QC9NQTB4NB8GTC6L6NKA",
 * "timestamp":"1516862216",
 * "sign":"219619027BE60F8B1E7CCC16979C233F"}
 */

public class WxPayResp {
    public int ReturnCode;
    public String appid;
    public String partnerid;
    public String PrepayId;
    public String noncestr;
    public String timestamp;
    public String sign;
    public String packageValue;
    public String payType;
    public String orderId;
    public String tradeNo;

    public WxPayResp(JSONObject wxPayJson){
        try {
            ReturnCode = wxPayJson.getInt("ReturnCode");
            appid = wxPayJson.getString("appid");
            partnerid = wxPayJson.getString("partnerid");
            PrepayId = wxPayJson.getString("PrepayId");
            noncestr = wxPayJson.getString("noncestr");
            timestamp = wxPayJson.getString("timestamp");
            sign = wxPayJson.getString("sign");
            packageValue = wxPayJson.getString("package");
            payType = wxPayJson.getString("payType");
            orderId = wxPayJson.getString("orderId");
            tradeNo = wxPayJson.getString("tradeNo");
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • 具体的接入方法不说了,看支付宝开发文档吧,我这里要说的是接入成功后如何去调用支付方法以及需要注意的一些事项。 首先...
    浅浅_e90e阅读 2,635评论 1 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,971评论 25 707
  • 开发前的准备工作 SDK说明 接口说明 1、支付接口 - (BOOL)startPay:(NSString*)tn...
    Detailscool阅读 3,399评论 5 50
  • 今天周日,初冬的阳光总是那样好的不得了,空气里虽然带着一丝凛冽,当阳光暖的仿佛要把人全身都化了。我在自习室里已经待...
    肆玖兮阅读 369评论 0 0
  • 元旦以来的这些日子,呆在家里有一些无所事事,如若不是越来越近的春节的话,还真找不出几分喜气,对这样太淡然的生活,反...
    戎苑居士阅读 963评论 0 0