目录

android开发之微信支付功能的实现

android开发之微信支付功能的实现

移动开发中,支付类的App越来越多,对于开发者来说也是不可少的,不可不会的:下面就来说一说支付开发的流程

1.申请你的AppID

请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。

2.下载SDK及API文档

Android Studio环境下:

在build.gradle文件中,添加如下依赖即可:

dependencies {

compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2’

}

3.在代码中使用开发工具包

[1] AndroidManifest.xml 设置

添加必要的权限支持:

<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"/>

[2] 注册到微信

要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(如下图所示,可以在程序入口Activity的onCreate回调函数处,或其他合适的地方将你的应用id注册到微信。注册函数示例如下图所示。

官方申请的合法的App—id

public static final String APP_ID = “你的key”;

//第三方和微信的接口:

private IWXAPI api;

[3] 发送请求或响应到微信

现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI的 sendReq 和 sendResp 两个方法来实现。

boolean sendReq(BaseReq req);

sendReq是第三方app主动发送消息给微信,发送完成之后会切回到第三方app界面。

boolean sendResp(BaseResp resp);

sendResp是微信向第三方app请求数据,第三方app回应数据之后会切回到微信界面。

JAVA代码:

/**
	 *  第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
	 *   arg0。errCode  0成功 -1支付失败 -2取消 
	 */
	@Override
	public void onResp(BaseResp resp) {
		Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
		if (resp.errCode == 0) {//支付成功
			Intent intent = new Intent();
			intent.setAction("fbPayAction");
//			intent.setAction("goodsPayAction");
//			intent.setAction("integraPayAction");	
			sendBroadcast(intent);	
			Toast.makeText(getApplicationContext(), "支付成功", 0).show();
			finish();
		}else if (resp.errCode == -1) {//支付失败
			Toast.makeText(getApplicationContext(), "支付失败", 0).show();
			finish();
		}else {//取消
			Toast.makeText(getApplicationContext(), "支付取消", 0).show();
			finish();
		}

[4] 接收微信的请求及返回值

如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:

a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge.simcpux,则新添加的类如下图所示)

https://img-blog.csdn.net/20170117191341056?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU3MDMyMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

并在manifest文件里面加上exported属性,设置为true,例如:

 <!-- 微信支付 -->
        <activity
            android:name="com.example.xiangcuntiandi.wxapi.WXPayEntryActivity"
            android:configChanges="orientation|keyboardHidden|navigation"
            android:exported="true"
            android:screenOrientation="behind" >
        </activity>

b. 实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法

c. 在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下图:

api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);

api.handleIntent(getIntent(), this);

当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

//Java代码:

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);
    	api = WXAPIFactory.createWXAPI(this, Constants.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) {
	}
	/**
	 *  第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
	 *   arg0。errCode  0成功 -1支付失败 -2取消 
	 */
	@Override
	public void onResp(BaseResp resp) {
		Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);
		if (resp.errCode == 0) {//支付成功
			Intent intent = new Intent();
			intent.setAction("fbPayAction");
//			intent.setAction("goodsPayAction");
//			intent.setAction("integraPayAction");	
			sendBroadcast(intent);	
			Toast.makeText(getApplicationContext(), "支付成功", 0).show();
			finish();
		}else if (resp.errCode == -1) {//支付失败
			Toast.makeText(getApplicationContext(), "支付失败", 0).show();
			finish();
		}else {//取消
			Toast.makeText(getApplicationContext(), "支付取消", 0).show();
			finish();
		}
		}

生成订单后只需要做如下处理:

https://img-blog.csdn.net/20170117193313659?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU3MDMyMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

我们都只道微信的支付流程是:提交订单到服务器,服务器将信息传递到微信支付的服务器,微信服务器响应后返回数据到自己的服务器,服务器又返回数据到客户端:取出数据后,跳转微信支付界面:、

/        /微信服务器返回的数据:调用这些数据到支付端
  >     PayReq req = new PayReq();
		req.appId = appid;
		req.partnerId = partnerid;
     	        req.prepayId = prepayid;
		req.nonceStr = noncestr;
	        req.timeStamp = timestamp;
		req.packageValue = packageValue;
		req.sign = sign;
		//在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信
		msgApi.sendReq(req);		

https://img-blog.csdn.net/20170117192417575?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU3MDMyMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

注意微信支付,分享,登陆,需要打包后二次签名:才能相应:

可以下载一个获取包的签名工具GenSignature.Apk,下载到手机上,手机上安装打包的Apk即可,得到:

https://img-blog.csdn.net/20170117192213551?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU3MDMyMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

得到后登陆微信开发者平台在填写即可:

https://img-blog.csdn.net/20170117192651045?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzU3MDMyMzQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center

这样一个完整的支付功能就做完了