微信支付的相关步骤
1.前提准备
公司的要求是接入微信支付,但是之前没怎么接触,这里记录下。申请注册审核的步骤都已经省略,这些工作,在项目开始的时候就需要开始进行申请,因为微信的审核期炒鸡长,而且这中间还可能回因为某些原因被拒。所以需要提前做好准备。下面这些是步骤:
1.首先拿到你的AppId(这个值是申请成功了之后微信给你的);
2.下载demo,微信支付给你的demo,主要是拿到里面的包。就这两个
文件夹下wechat-sdk-android-with-mta-1.0.2.jar在开发联调环境中使用。
3.你需要在你的app根文件目录下,有这么一个文件目录:
微信的要求,因为它会自动在你的根目录下检索文件,也就是这个包。
4.在文件目录下有这个一个文件,整个拷贝过来,这也是微信的要求整个拷贝过来。
2. 开发准备
做好了基本的准备功能,下面这里的是具体的调用步骤:
1.新建一个bean类,名字为WXPayBean.java。以我的项目为例子。(特别说一下,这里的参数,是后台哪边返回的,具体的值,由后台哪边定,基本上就这么点。)
public class WXPayBean implements Serializable {
private String appid;
private String mchId;
private String nonceStr;
private String prepayId;
private String resultCode;
private String returnCode;
private String returnMsg;
private String sign;
private String timeStamp;
private String tradeType;
private String packageValue;
public String getPackageValue() {
return packageValue;
}
public void setPackageValue(String packageValue) {
this.packageValue = packageValue;
}
public String getAppid() {
return appid;
}
public void setAppid(String appid) {
this.appid = appid;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
public String getNonceStr() {
return nonceStr;
}
public void setNonceStr(String nonceStr) {
this.nonceStr = nonceStr;
}
public String getPrepayId() {
return prepayId;
}
public void setPrepayId(String prepayId) {
this.prepayId = prepayId;
}
public String getResultCode() {
return resultCode;
}
public void setResultCode(String resultCode) {
this.resultCode = resultCode;
}
public String getReturnCode() {
return returnCode;
}
public void setReturnCode(String returnCode) {
this.returnCode = returnCode;
}
public String getReturnMsg() {
return returnMsg;
}
public void setReturnMsg(String returnMsg) {
this.returnMsg = returnMsg;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
public String getTimeStamp() {
return timeStamp;
}
public void setTimeStamp(String timeStamp) {
this.timeStamp = timeStamp;
}
public String getTradeType() {
return tradeType;
}
public void setTradeType(String tradeType) {
this.tradeType = tradeType;
}
}
- 接下来,是请求后台的接口,然后对后台接口返回值进行操作。这里是自己封装的请求
Ordernumber,是自己项目的订单编号。
final IWXAPI api = WXAPIFactory.createWXAPI(this, Constants.APP_ID,false);
api.registerApp(Constants.APP_ID); //将微信返回给你的AppId值带进去就好了。
onResponse 是请求成功以后返回的值。将object 的类型转换为你之前见的bean类。
取出返回的数据。
appId,这个值可以自己取,也可以用之前的固定值
mchId 、这里注意下,微信的小坑。 你看微信的文档时候,https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1
在Api列表里面,统一下单和调起支付接口的请求参数,都是商户号,但是商户号的值竟然不一样。 Partnered 和mch_id
主要代码就是这一点:
PayReq req = new PayReq();
req.appId =appId;
req.partnerId =mchId;
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp=wxContent.getTimeStamp();
req.sign = sign;
req.packageValue=wxContent.getPackageValue();
api.sendReq(req);
//微信支付
public void WXPay(String orderNumber) {
final IWXAPI api = WXAPIFactory.createWXAPI(this, Constants.APP_ID,false);
api.registerApp(Constants.APP_ID);
HttpPostAsyn asyn=new HttpPostAsyn(ApiConfig.PATH_USER);
asyn.addParamters("action","unified_order");
asyn.addParamters("body","项目名称-"+categoryName);
asyn.addParamters("price",totalPrice+"");
asyn.addParamters("outtradeno",orderNumber);
asyn.addCallBack(new HttpCallBack() {
@Override
public void onFailure(CustomizException e) throws Exception {
@Override
public void onResponse(Object object1) throws Exception {
WXPayBean wxContent = (WXPayBean) object1;
if(wxContent!=null){
String appId = wxContent.getAppid();
String mchId = wxContent.getMchId();
String prepayId = wxContent.getPrepayId();
String nonceStr = wxContent.getNonceStr();
String sign = wxContent.getSign();
try {
PayReq req = new PayReq();
req.appId =appId;
req.partnerId =mchId;
req.prepayId = prepayId;
req.nonceStr = nonceStr;
req.timeStamp=wxContent.getTimeStamp();
req.sign = sign; req.packageValue=wxContent.getPackageValue();
// Toast.makeText(mContext, "正常调起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信 api.sendReq(req);
} catch (Exception e) {
e.printStackTrace();
Log.e("tag", "异常:" + e.getMessage()); Toast.makeText(mContext, "异常:" + e.getMessage(), Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(mContext, "服务器请求错误", Toast.LENGTH_SHORT).show();
}
}
});
OkHttpUtil.HttpAsyn(asyn,WXPayBean.class); }
3.最后一步,准备工作的时候有一个拷贝的Activity,WXPayEntryActivity.java ,还记得吧.(这个文件是为了接受第7步,api.sendReq(req); 发过来的数据,根据 resp.errCode的值,来确定你的下一步操作,只有是0的时候,才是正常的,其他的时候,都是非正常的。 )
添加判断
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode){
case 0:
//请求正常,进行下一步的操作。。。。
break;
case -1:
UiHelper.Toast(this,"支付异常,请联系商家");
break; case -2:
UiHelper.Toast(this,"支付取消");
break; }
finish();
}
微信支付的一点小坑:
微信文档很简单,错误提示更少。文档上这样写,一般-1的时候都是 签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。这句话说的好笼统,但是微信的文档就是这样,你需要一个个的检查。出现问题,你会发疯,不知道从何下手。
之前我自己做的时候也出现了这种情况,这个时候千万不要慌,慢慢检查你的参数:
1.检查你的AppId值,这个值是在注册的时候给你的,所以你要看看你是不是少了,或者错了。
2.检查签名,这里最需要注意了,一般加签我们都是在后台直接传过来的,写在App端加签,不安全,和你的后台好好去对对,多调试几次。(我之前查了一晚上,四个多小时,后面就是后台加签名传错了某个值,然后出现-1.搞的我差点想打死那货,莫名其妙被加了班,那货下班就走了。想想都气人)
3.检查你的代码,一般我们在写代码的时候都是按照文档上来的,这时候也不能马虎,某个值的错误可能会导致你前功尽弃。耐心点吧。
好了,到此结束。
最后祝你不要碰到坑。