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

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

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

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 设置

添加必要的权限支持:

  1. <uses-permission android:name="android.permission.INTERNET"/>  
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  
  3. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>  
  4. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>  
  5. <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代码:
  1. /**  
  2.      *  第三方应用发送到微信的请求处理后的响应结果,会回调到该方法  
  3.      *   arg0。errCode  0成功 -1支付失败 -2取消   
  4.      */  
  5.     @Override  
  6.     public void onResp(BaseResp resp) {  
  7.         Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);  
  8.         if (resp.errCode == 0) {//支付成功  
  9.             Intent intent = new Intent();  
  10.             intent.setAction("fbPayAction");  
  11. //          intent.setAction("goodsPayAction");  
  12. //          intent.setAction("integraPayAction");     
  13.             sendBroadcast(intent);    
  14.             Toast.makeText(getApplicationContext(), "支付成功", 0).show();  
  15.             finish();  
  16.         }else if (resp.errCode == -1) {//支付失败  
  17.             Toast.makeText(getApplicationContext(), "支付失败", 0).show();  
  18.             finish();  
  19.         }else {//取消  
  20.             Toast.makeText(getApplicationContext(), "支付取消", 0).show();  
  21.             finish();  
  22.         }  

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

如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面3步操作:
a. 在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity(例如应用程序的包名为net.sourceforge.simcpux,则新添加的类如下图所示)

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

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

  1. <!-- 微信支付 -->  
  2.        <activity  
  3.            android:name="com.example.xiangcuntiandi.wxapi.WXPayEntryActivity"  
  4.            android:configChanges="orientation|keyboardHidden|navigation"  
  5.            android:exported="true"  
  6.            android:screenOrientation="behind" >  
  7.        </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代码:
  1. public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{  
  2.     private static final String TAG = "MicroMsg.SDKSample.WXPayEntryActivity";  
  3.     private IWXAPI api;  
  4.     @Override  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.pay_result);  
  8.         api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);  
  9.         api.handleIntent(getIntent(), this);  
  10.     }  
  11.     @Override  
  12.     protected void onNewIntent(Intent intent) {  
  13.         super.onNewIntent(intent);  
  14.         setIntent(intent);  
  15.         api.handleIntent(intent, this);  
  16.     }  
  17.     @Override  
  18.     public void onReq(BaseReq req) {  
  19.     }  
  20.     /**  
  21.      *  第三方应用发送到微信的请求处理后的响应结果,会回调到该方法  
  22.      *   arg0。errCode  0成功 -1支付失败 -2取消   
  23.      */  
  24.     @Override  
  25.     public void onResp(BaseResp resp) {  
  26.         Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);  
  27.         if (resp.errCode == 0) {//支付成功  
  28.             Intent intent = new Intent();  
  29.             intent.setAction("fbPayAction");  
  30. //          intent.setAction("goodsPayAction");  
  31. //          intent.setAction("integraPayAction");     
  32.             sendBroadcast(intent);    
  33.             Toast.makeText(getApplicationContext(), "支付成功", 0).show();  
  34.             finish();  
  35.         }else if (resp.errCode == -1) {//支付失败  
  36.             Toast.makeText(getApplicationContext(), "支付失败", 0).show();  
  37.             finish();  
  38.         }else {//取消  
  39.             Toast.makeText(getApplicationContext(), "支付取消", 0).show();  
  40.             finish();  
  41.         }  
  42.         }  

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

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

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

  1. /        /微信服务器返回的数据:调用这些数据到支付端  
  2.   >     PayReq req = new PayReq();  
  3.         req.appId = appid;  
  4.         req.partnerId = partnerid;  
  5.                 req.prepayId = prepayid;  
  6.         req.nonceStr = noncestr;  
  7.             req.timeStamp = timestamp;  
  8.         req.packageValue = packageValue;  
  9.         req.sign = sign;  
  10.         //在支付之前,如果应用没有注册到微信,应该先调用IWXMsg.registerApp将应用注册到微信  
  11.         msgApi.sendReq(req);<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">     </span>  


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

注意微信支付,分享,登陆,需要打包后二次签名:才能相应:
可以下载一个获取包的签名工具GenSignature.Apk,下载到手机上,手机上安装打包的Apk即可,得到:

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

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

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

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