1、准备工作
在微信开放平台进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。
微信支付的开发方式和支付宝不同,微信支付在客户端不需要太多操作,大多依赖于服务器端。
2、导入jar包
将libammsdk.jar包放入应用工程的libs目录下。
3、修改AndroidManifest.xml文件
在AndroidManifest.xml文件中添加如下代码:
<!-- ==================== 微信支付配置开始 ==================== -->
<activity
android:name="com.subzero.copass.wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop" />
<!-- ==================== 微信支付配置结束 ==================== -->
*** 注意:添加启动模式 android:launchMode=“singleTop”。**
添加权限:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
4、创建结果回调页
pay_result.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#FFE1E8EB"
android:gravity="center_horizontal">
<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:textColor="#ff000000"
android:textSize="20dp"
android:text="这个界面用于显示第三方app通过微信支付的结果"/>
</LinearLayout>
5、支付结果回调类
需要注意的是这个类必须放在包名为**.wxapi里面。例:包名com.subzero.copass (com.subzero.copass .wxapi.WXPayEntryActivity),否则微信支付结果不会调用这个类来回调微信的支付结果。
微信支付回调的结果resp.errCode。
WXPayEntryActivity.java
/**
* 微信支付完成后回调onResp函数
* 此类必须放在包名.wxapi里面。例:包名com.subzero.copass (com.subzero.copass .wxapi.WXPayEntryActivity);
*/
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{
private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";
private IWXAPI api;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay_result);
//微信APP_ID
api = WXAPIFactory.createWXAPI(this, PayConfig.APP_ID);
api.handleIntent(getIntent(), this);
}
@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) {
Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
String msg = "";
if (resp.errCode == 0) {
msg = "支付成功";
} else if (resp.errCode == -1) {
msg = "已取消支付";
} else if (resp.errCode == -2) {
msg = "支付失败";
}
Toast.makeText(WXPayEntryActivity.this, msg, Toast.LENGTH_SHORT).show();
finish();
}
}
6、调起支付
微信支付的步骤是先调用服务器接口,由服务器调用接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付。
微信支付需要手机安装有微信的客户端。如果没有安装微信客户端,无法调起支付。
api.sendReq(req);发送请求或发送响应到微信终端,可以通过IWXAPI的 sendReq 和 sendResp 两个方法来实现。
此接口为微信官方测试接口。实际的微信支付功能请您在支付时调起应用后台的接口获取相应数据并使用api.sendReq(req);方法调起微信支付。
private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.pay);
//微信appId
api = WXAPIFactory.createWXAPI(context, PayConfig.APP_ID);
Button appayBtn = (Button) findViewById(R.id.appay_btn);
appayBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = "http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=android;
Toast.makeText(PayActivity.this, "获取订单中...", Toast.LENGTH_SHORT).show();
try{
byte[] buf = Util.httpGet(url);
if (buf != null && buf.length > 0) {
String content = new String(buf);
Log.e("get server pay params:",content);
JSONObject json = new JSONObject(content);
if(null != json && !json.has("retcode") ){
PayReq req = new PayReq();
//req.appId = "wxf8b4f85f3a794e77"; // 测试用appId
//从服务器获取
req.appId = json.getString("appid");
req.partnerId = json.getString("partnerid");
req.prepayId = json.getString("prepayid");
req.nonceStr = json.getString("noncestr");
req.timeStamp = json.getString("timestamp");
req.packageValue = json.getString("package");
req.sign = json.getString("sign");
req.extData = "app data"; // optional
Toast.makeText(PayActivity.this, "正常调起支付", Toast.LENGTH_SHORT).show();
// 在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
api.sendReq(req);
}else{
Log.d("PAY_GET", "返回错误"+json.getString("retmsg"));
Toast.makeText(PayActivity.this, "返回错误"+json.getString("retmsg"), Toast.LENGTH_SHORT).show();
}
}else{
Log.d("PAY_GET", "服务器请求错误");
Toast.makeText(PayActivity.this, "服务器请求错误", Toast.LENGTH_SHORT).show();
}
}catch(Exception e){
Log.e("PAY_GET", "异常:"+e.getMessage());
Toast.makeText(PayActivity.this, "异常:"+e.getMessage(), Toast.LENGTH_SHORT).show();
}
payBtn.setEnabled(true);
}
});
}
此图为APP端调起支付的参数列表。
注意:微信支付需要打包APK,否则无法调起微信客户端进行支付,只能在你未登录微信的情况下调起微信登录!