安卓第三方支付之微信支付

1、相关地址
微信开发平台:

https://pay.weixin.qq.com/wiki/doc/api/index.html

SDK下载:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1

异步通知文档:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3
微信支付测试接口:
http://wxpay.wxutil.com/pub_v2/app/app_pay.php
微信开发者平台登录入口
https://open.weixin.qq.com/
微信支付签名工具:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5
注意:
一:如果运行demo,要将微信demo的debug.keystore放到本地。
二:支付失败要清理微信缓存。
微信支付很特殊:keystore签名+包名绑定+应用名称,安全码策略。
2、集成步骤
**2.1、**在build.gradle文件中,添加如下依赖:

dependencies {
   compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}

**2.2、**清单文件声明权限和activity

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<activity
   android:name="net.sourceforge.simcpux.wxapi.WXPayEntryActivity"
   android:exported="true"
   android:launchMode="singleTop"/>

注意:上述声明的activity(WXPayEntryActivity)需要从demo中拷贝WXPayEntryActivity.java文件放到我们工程中,包名要保持不变。

2.3、 调用微信支付sdk
赋值后调用sendReq完成支付

/**调用微信支付*/
public void sendPayRequest() {
    PayReq req = new PayReq();
    req.appId = payInfo.getAppId();
    req.partnerId = payInfo.getPartnerId();
    req.prepayId = payInfo.getPrepayId();
    req.nonceStr = payInfo.getNonceStr();
    req.timeStamp = payInfo.getTimestamp();
    req.packageValue = payInfo.getPackageValue();
    req.sign = payInfo.getSign();
    // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
    //3.调用微信支付sdk支付方法
    api.sendReq(req);
}

**2.4、**处理支付结果
在net.sourceforge.simcpux.wxapi.WXPayEntryActivity.java类的onResp方法中处理支付结果:

@Override
public void onResp(BaseResp resp) {
    Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
    //支付成功
    if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setTitle("支付结果");
        builder.setMessage(resp.errCode + "");
        builder.show();
    }
}

**3、**代码MainActivity

package net.sourceforge.simcpux;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import com.alibaba.fastjson.JSON;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

public class MainActivity extends AppCompatActivity implements Response.Listener<String>, Response.ErrorListener {
    private String url;
    private WeiXinBean weiXinBean;
    private IWXAPI api;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //微信支付测试接口,正式开发必须使用公司自己的接口
        url = "http://wxpay.wxutil.com/pub_v2/app/app_pay.php";
        initWechat();
    }

    /**
     * 初始化微信支付api
     */
    private void initWechat() {
        api = WXAPIFactory.createWXAPI(this, "wxb4ba3c02aa476ea1");
    }

    public void wechatpay(View view){
        //1.post信息到服务器
        StringRequest request = new StringRequest(url, this, this);
        RequestQueue queue = Volley.newRequestQueue(this);
        queue.add(request);
        //4.处理支付结果:成功、失败、取消
    }

    @Override
    public void onResponse(String response) {
        //2.解析服务器返回,获取“支付串码”
        response = response.replaceAll("package", "packageValue");
        weiXinBean = JSON.parseObject(response, WeiXinBean.class);
        Log.e("result", weiXinBean.toString());
        //3.调用微信支付sdk的支付方法,传入支付串码
        sendPayRequest();
    }

    @Override
    public void onErrorResponse(VolleyError volleyError) {

    }

    /**调用微信支付*/
    public void sendPayRequest() {
        PayReq req = new PayReq();
        req.appId = weiXinBean.getAppid();
        req.partnerId = weiXinBean.getPartnerid();
        //预支付订单
        req.prepayId = weiXinBean.getPrepayid();
        req.nonceStr = weiXinBean.getNoncestr();
        req.timeStamp = weiXinBean.getTimestamp()+"";
        req.packageValue = weiXinBean.getPackageValue();
        req.sign = weiXinBean.getSign();
        // 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
        //3.调用微信支付sdk支付方法
        api.sendReq(req);
    }
}

**4、**小结
调用:初始PayReq对象里面的核心参数,然后调用api.sendReq(req)。
在net.sourceforge.simcpux.wxapi.WXPayEntryActivity里面处理支付结果,需要拷贝到我们项目工程里面,包名不能变,否则接受不到结果。
异步通知:微信服务器通知商户服务器支付结果,商户服务器需要给微信服务器返回响应。
支付串码是谁生成的:除了prepayId是微信服务器生成的,其他参数都是商户服务器生成。

更多精彩,尽在个人博客

github地址

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值