1、相关地址
微信开发平台:
https://pay.weixin.qq.com/wiki/doc/api/index.html1
SDK下载:
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_11
异步通知文档:
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();
}
}1234567891011
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是微信服务器生成的,其他参数都是商户服务器生成。