Android集成微信支付SDK,实现支付功能

官方集成文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5#

一、在您 App Module 的 build.gradle 中,添加下面的内容,将微信 SDK 作为项目依赖:

dependencies {
    //添加下面的内容
    implementation 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
    //...其他依赖项
}

二、在项目中创建wxapi文件夹,在其下创建WXPayEntryActivity类。

三、在清单文件AndroidManifest.xml的application标签中配置如下代码:

<activity
    android:name=".wxapi.WXPayEntryActivity"
    android:exported="true"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <data android:scheme="你的appid"/>
    </intent-filter>

</activity>

至此。配置就结束了,接下来上具体代码演示:

首先,订单的加密下单都应在后台操作,所以先调用自己后台的接口,传递相应参数给后台,可以使其携带参数调取微信的接口,达到成功下单,成功下单后,微信会返回一个xml数据串,但这个数据串不能直接让移动端调取微信sdk支付,需要再签名一下,可以让后台直接完成。但我这是自己移动端进行了签名,用到的工具类,以下也已提供WXPaySignUtil类,MD5Util类。

WXPayEntryActivity类

public class WXPayEntryActivity extends BaseActivity implements IWXAPIEventHandler {

    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
    @BindView(R.id.wechat_paysucced_tv)
    TextView wechatPaysuccedTv;
    @BindView(R.id.wechat_sure_btn)
    TextView wechatSureBtn;

    private IWXAPI api;

    @Override
    protected int getLayoutID() {
        return R.layout.pay_result;
    }

    @Override
    public void initView() {
        api = MyApplication.getWXapi();
        try {
            if (!api.handleIntent(getIntent(), this)) {
                finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        TextView wechatSureBtn = findViewById(R.id.wechat_sure_btn);
        wechatSureBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(WXPayEntryActivity.this, ModelTwoRegistrationActivity.class));
                finish();
            }
        });
    }

    @Override
    public void initPresenter() {

    }

    @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) {

        int code = resp.errCode;

        switch (code) {
            case 0://支付成功

                wechatPaysuccedTv.setText("支付成功");
                wechatSureBtn.setText("完成");

                break;
            case -1://支付失败("签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、您的微信账号异常等。")
                wechatPaysuccedTv.setText("支付失败:-1");
                wechatSureBtn.setText("返回");

                break;
            case -2://用户取消支付后的界面
                wechatPaysuccedTv.setText("支付失败,用户取消支付");
                showToast("用户取消支付");
                wechatSureBtn.setText("返回");
                break;
        }
        Log.e(TAG, "onPayFinish, errCode = " + resp.errCode + ", errStr = " + resp.errStr + ", openId = " + resp.openId + ",transaction = " + resp.transaction);

//        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
//            AlertDialog.Builder builder = new AlertDialog.Builder(this);
//            builder.setTitle("支付结果");
//            builder.setMessage(getString(R.string.pay_result_callback_msg, String.valueOf(resp.errCode)));
//            builder.show();
//        }
    }


    @OnClick(R.id.wechat_sure_btn)
    public void onViewClicked() {

        Intent intent = new Intent(WXPayEntryActivity.this, ModelTwoRegistrationActivity.class);
        startActivity(intent);
        finish();

    }

    回调中errCode值列表:

名称描述解决方案
0成功展示成功页面
-1错误可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
-2用户取消无需处理。发生场景:用户不支付了,点击取消,返回APP。

 

WXPaySignUtil类
public class WXPaySignUtil {

    //对后台返回的预支付订单进行加密
    public static  Map<String, String> payInfo(String appId,String micId, String prepayId, String nonceStr, String timeStamp, String sign){

        SortedMap<String, String> signParam = new TreeMap<String, String>();
        signParam.put("appid", appId);//app_id
        signParam.put("partnerid", micId);//微信商户账号
        signParam.put("prepayid", prepayId);//预付订单id
        signParam.put("package", "Sign=WXPay");//默认sign=WXPay
        signParam.put("noncestr", nonceStr);//自定义不重复的长度不长于32位
        signParam.put("timestamp",timeStamp);//北京时间时间戳
        String signAgain = createSign("UTF-8", signParam);//再次生成签名
        signParam.put("sign", signAgain);
        return signParam;
    }

    //定义签名,微信根据参数字段的ASCII码值进行排序 加密签名,故使用SortMap进行参数排序
    public static String createSign(String characterEncoding,SortedMap<String,String> parameters){
        StringBuffer sb = new StringBuffer();
        Set es = parameters.entrySet();
        Iterator it = es.iterator();
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String k = (String)entry.getKey();
            Object v = entry.getValue();
            if(null != v && !"".equals(v)
                    && !"sign".equals(k) && !"key".equals(k)) {
                sb.append(k + "=" + v + "&");
            }
        }
        sb.append("key=" + "f1a2s3d4g5r6e7g8g9a0gsXXXXwwwwsd");//最后加密时添加商户密钥,由于key值放在最后,所以不用添加到SortMap里面去,单独处理,编码方式采用UTF-8
        String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
        return sign;
    }
}
MD5Util类
class MD5Util {

    private static String byteArrayToHexString(byte b[]) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++)
            resultSb.append(byteToHexString(b[i]));

        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n += 256;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }

    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname))
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes()));
            else
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes(charsetname)));
        } catch (Exception exception) {
        }
        return resultString;
    }

    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
}

在application类中注册APPID

public class MyApplication extends LitePalApplication {

    private static Context mContext;

    public static final String APP_ID = "你的appid";
    private static IWXAPI api;

    public static Context getInstance() {
        return mContext;
    }

    @Override
    protected void attachBaseContext(Context context) {
        super.attachBaseContext(context);
        MultiDex.install(context);
    }
    @Override
    public void onCreate() {
        super.onCreate();
        mContext = this;
    }
             
    public static IWXAPI getWXapi() {

        return api;
    }
}
//普通商户版微信支付
public void wechatPay(String partnerId, String prepayId, String nonceStr, String timeStamp, String sign) {

    PayReq req = new PayReq();
    req.appId = MyApplication.APP_ID;//你的微信appid
    req.partnerId = partnerId;//商户号
    req.prepayId = prepayId;//预支付交易会话ID
    req.nonceStr = nonceStr;//随机字符串
    req.timeStamp = timeStamp;//时间戳
    req.packageValue = "Sign=WXPay";//扩展字段,这里固定填写Sign=WXPay
    req.sign = sign;//签名
    req.extData = "app data"; // optional
    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    MyApplication.getWXapi().sendReq(req);
}
//服务商版微信支付
public void wechatFwsPay(String appId, String mchId, String prepayId, String nonceStr, String timeStamp, String sign) {

    //服务商版支付
    PayReq req = new PayReq();
    req.appId = "wx8864d62b0167ecd8";//子商户appid
    req.partnerId = "1554575261";//子商户号
    req.prepayId = prepayId;
    req.packageValue = "Sign=WXPay";
    req.nonceStr = nonceStr;
    req.timeStamp = timeStamp;
    req.sign = sign;
    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    MyApplication.getWXapi().sendReq(req);
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperMonsterH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值