安卓客户端接入微信支付功能

微信App接入文档

Android微信支付集成步骤

准备工作

在应用集成微信支付之前,我们在微信开放平台必须要个开发者账户

1.注册完之后创建一个移动应用,并获取APPid等可以参考:
http://blog.csdn.net/vroymond/article/details/53422744
2.申请开通微信支付能力

  • 认证开发者资格
  • 开通微信支付
    3.开通成功后,获取得到商户号并在商户平台配置API密钥(生成预支付订单号需要)

API密钥配置流程:http://help.ecmoban.com/article-2085.html

4.在项目中导入微信提供的jar包

5.在项目包名下创建一个wxapi的包,并创建一个WXPayEntryActivity的类(微信分享以及登录必须要求,该类继承activity并实现IWXAPIEventHandler接口,用于拿到支付的回调结果),并在清单文件中注册。

调起微信支付

步骤:
1.客户端(APP)提交订单信息给服务端,服务端根据微信接口:统一下单接口,生成预支付Id(prepay_id)返回给客户端。
2.客户端(APP)根据预支付Id(prepay_id)调起微信支付

如何生成预支付Id(一般在服务端生成)?

根据统一下单接口文档的规则:

服务端需要必须提交的参数字段有以下这些:(POST格式为XML)

  • 应用ID appid 微信开放平台审核通过的应用APPID
  • 商户号 mch_id 微信支付分配的商户号
  • 随机字符串 nonce_str 随机数生成算法
  • 商品描述 body
  • 商户订单号 out_trade_no
  • 总金额 total_fee
  • 终端IP spbill_create_ip
  • 通知地址 notify_url
  • 交易类型 trade_type
  • 签名 sign 签名生成算法(重要)

详情可看:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1

sign签名生成:

1.把我们所需要提交的参数(除sign外),拼接成URL键值对的格式(即key1=value1&key2=value2…)

2.得到拼接后的字符串之后拼接在商户平台生成 API密钥

3.拼接完key之后,进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign

提交所有参数 调起统一下单接口 获取预支付Id
APP客户端调起微信支付

根据微信提供的调起微信支付的规则,APP端需要提交的参数为:
1.sign签名生成
​ sign签名生成步骤跟上面叙述的是一样的(省略)。
2.生成完签名,拼接所有支付参数。(PayReq,IWXAPI是微信提供jar包里的类
3.调起微信支付
(注意,运行的应用签名必须跟在微信开放平台的签名需要一致,为了方便调试可以让debug使用relase签名,配置步骤可参考:http://www.cnblogs.com/niray/p/5242985.html)

至此,调起微信支付所有步骤完成

源码地址:

效果图:
微信支付封装的工具类

/**
 * Created by xmg on 2016/12/5.
 */

public class WXpayUtils {

    private static PayReq req;
    private static IWXAPI iwxapi;
    private static Context mContext;

    private WXpayUtils(){}
    private static WXpayUtils WxPayInstance = null;

    public static WXpayUtils getWXPayInstance(Context context,String appId){
        if (WxPayInstance == null) {
            synchronized (WXpayUtils.class) {
                iwxapi = WXAPIFactory.createWXAPI(context, null);  //通过WXAPIFactory创建IWAPI实例
                req = new PayReq(); //创建支付实体类
                iwxapi.registerApp(appId); //将应用的appid注册到微信
                WxPayInstance = new WXpayUtils();
            }
            mContext = context;
        }
        return WxPayInstance;
    }

    /**
     *生成随机字符串
     */
    public String genNonceStr() {
        Random random = new Random();
        return MD5Util.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
    }

    /**
     * 获得时间戳,单位是秒
     */
    private long genTimeStamp() {
        return System.currentTimeMillis() / 1000;
    }

    /**
     * 生成预支付随机签名,服务器使用
     */
    public String genSign(OrederSendInfo info,String appId) {
        StringBuffer sb = new StringBuffer(info.toString());
        if ("".equals(appId)){
            Toast.makeText(mContext,"APP_ID为空",Toast.LENGTH_LONG).show();
        }
        //拼接密钥
        sb.append("key=");
        sb.append(appId);
        String appSign = MD5Util.getMessageDigest(sb.toString().getBytes());
        return appSign;
    }

    /**
     * 生成支付随机签名
     */
    private String genAppSign(List<Param> params,String apiKey){
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < params.size(); i++) {
            sb.append(params.get(i).key);
            sb.append('=');
            sb.append(params.get(i).value);
            sb.append('&');
        }
        //拼接密钥
        sb.append("key=");
        sb.append(apiKey);
        String appSign = MD5Util.getMessageDigest(sb.toString().getBytes());
        return appSign.toUpperCase();
    }

    /**
     * 生成支付参数
     */
    private void createPayParamReq(WXPrepayOrderInfo prepayOrderInfo) {
       /* req.appId = appId;
        req.partnerId = mchId;
        req.prepayId = prepayId;
        req.packageValue = "Sign=" + prepayId;
        req.nonceStr = genNonceStr();
        req.timeStamp = String.valueOf(genTimeStamp());
        req.signType = "MD5";
        req.sign = sign;*/
        req.appId = prepayOrderInfo.getAppId();
        req.partnerId = prepayOrderInfo.getMchId();
        req.prepayId = prepayOrderInfo.getPrepayId();
        req.packageValue = "Sign=" + prepayOrderInfo.getPrepayId();
        req.nonceStr = prepayOrderInfo.getNonceStr();
        req.timeStamp = prepayOrderInfo.getTimeStamp();
        req.signType = prepayOrderInfo.getSignType();
        req.sign = prepayOrderInfo.getSign();
        List<Param> signParams = new LinkedList<>();
        signParams.add(new Param("appid", req.appId));
        signParams.add(new Param("noncestr", req.nonceStr));
        signParams.add(new Param("package", req.packageValue));
        signParams.add(new Param("partnerid", req.partnerId));
        signParams.add(new Param("prepayid", req.prepayId));
        signParams.add(new Param("timestamp", req.timeStamp));
        LogUtils.d(">>>>>>>>>>>>>","服务器生成的密钥:"+prepayOrderInfo.getSign());
        LogUtils.d(">>>>>>>>>>>>>","app生成的密钥:"+genAppSign(signParams, ConstantConfig.API_KEY));
    }

    public void startWxPay(WXPrepayOrderInfo prepayOrderInfo){
        if (judgeCanGo()){
            createPayParamReq(prepayOrderInfo);
            iwxapi.registerApp(prepayOrderInfo.getAppId());
            iwxapi.sendReq(req);
        }
    }

    private boolean judgeCanGo(){
        if (!iwxapi.isWXAppInstalled()) {
            Toast.makeText(mContext, "请先安装微信应用", Toast.LENGTH_SHORT).show();
            return false;
        } else if (!iwxapi.isWXAppInstalled()) {
            Toast.makeText(mContext, "请先更新微信应用", Toast.LENGTH_SHORT).show();
            return false;
        }
        return true;
    }
    /**
     * post请求参数类   这里可以根据项目抽取成泛型
     */
    public class Param {
        public String key;
        public String value;
        public Param() {
        }
        public Param(String key, String value) {
            this.key = key;
            this.value = value;
        }
    }
}

后面调试成功之后会回调客户端,主要为了通知客户端去查询微信后台订单是否已经成功,这个过程也需要商户服务器去查询到结果之后返回给客户端。

/**
 * 微信支付回调
 */
public class WXPayEntryActivity extends AbsFenJActivity implements IWXAPIEventHandler {

    private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";

    private IWXAPI api;

    @Override
    public int getLayoutId() {
        return R.layout.activity_pay_result;
    }

    @Override
    public void initViews(Bundle savedInstanceState) {

    }

    @Override
    public void initData(Bundle savedInstanceState) {
        api = WXAPIFactory.createWXAPI(this, "");
        api.handleIntent(getIntent(), this);
    }

    @Override
    public void initListeners() {

    }

    @Override
    public boolean isSwipeBackAble() {
        return false;
    }

    @Override
    public boolean isBindEventBus() {
        return false;
    }

    @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) {
        PayResp wxResp = (PayResp) resp;
        if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
            if (resp.errCode == 0) {//跳转到支付成功的订单详情页面
                checkWeixinPaymentResultState(wxResp.prepayId);//支付结果 100 成功 102
                showCentreToastByText("支付中...");
            } else if (resp.errCode == -2) {
                showCentreToastByText("支付失败,请重试");
                finish();
            } else {
                showCentreToastByText("支付参数错误...");
                finish();
            }
        } else {
            finish();
        }
    }
    /**
     * 再次请求后台,查看微信支付结果
     */
    private void checkWeixinPaymentResultState(String tradeNumber){
        NetController<WXPayStateInfo> controller = new NetController<WXPayStateInfo>(mDisposable) {
            @Override
            public void success(Response<WXPayStateInfo> result) {
                if(ObjectUtils.isNotEmpty(result.getData())){
                    Bundle bundle = new Bundle();
                    bundle.putSerializable("WX_PAY_RESULT",  result.getData());
                    launchActivity(CommRouter.BUY_VIP_MEMBER_RESULT,bundle);
                    UserPreferences.saveKeyMineRefreshState(true);
                }
                finish();
            }

            @Override
            public void failure(Throwable throwable) {
                super.failure(throwable);
                finish();
            }
        };
        PayCallParam payCallParam = new PayCallParam();
        payCallParam.setPrepayId(tradeNumber);
        payCallParam.setTradeStatus(100);
        payCallParam.setTradeType("APP");
        controller.request(StudentApi.getService().getWXPayOrderStateInfo(payCallParam));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值